C++ 나는야 포켓몬 마스터 이다솜 - (STL 사용하지 않고 풀기) - 백준 알고리즘
Updated:
1620번 나는야 포켓몬 마스터 이다솜 - (STL 사용하지 않고 풀기)
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
using namespace std;
struct Node
{
string data; // 포켓몬 이름
int id; // 포켓몬 이름에 해당하는 ID
Node* left; // left child
Node* right; // right child
};
Node* root = NULL; // 초기값
Node* search(string item); // search
void insert(string item, int num); // bst를 구성하기 위한 insert
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N, M;
string data;
vector<string> v; // 숫자가 입력으로 왔을 때 이름 찾는 용도
cin >> N >> M;
v.resize(N + 1); // vector size 설정
for (int i = 1; i <= N; i++) // vector v 초기화
v[i] = '0';
for (int i = 1; i <= N; i++) // 입력 받기
{
cin >> data;
insert(data, i); // data와 id를 추가
v[i] = data; // 찾을 때 숫자가 입력으로 받을경우 출력하기 위해서 설정
}
for (int i = 0; i < M; i++) // 질문 받기
{
char name[20] = {'0'}; // 포켓몬 이름은 20자를 넘지 않는다고 했으므로
string full_name;
cin >> full_name;
strcpy(name, full_name.c_str()); // string을 char로 변환
if (isalpha(name[0])) //name이 알파벳이면 1반환(대문자) 아니면 0반환
{
cout << search(full_name)->id << "\n";
}
else // 숫자인 경우
{
cout << v[stoi(full_name)] << "\n";
}
}
return 0;
}
Node* search(string item)
{
Node* x = root; // root를 가리키는 x
while (x != NULL && x->data != item) // data가 있는 경우 and data가 item이 아닌 경우
{
if (item < x->data) // 찾으려는 item이 x보다 작으면 왼쪽 child로 보냄
x = x->left;
else
x = x->right; // 아니면 오른쪽으로
}
return x;
}
void insert(string item, int num) // item과 num을 추가
{
Node * x, *y;
Node* ins;
ins = new Node; // 할당
ins->data = item; // 입력받은 item을 data에 저장
ins->id = num; // 입력받은 num을 id에 저장
ins->left = ins->right = NULL; // ins의 left와 right를 NULL
y = NULL;
x = root;
while (x != NULL) // x가 NULL이 될 떄까지 값이 작은지 큰지를 비교하면서 넣을 공간을 찾음
{
// find y, the parent of ins
y = x;
if (ins->data < x->data) // x보다 작으면 left로 이동
x = x->left;
else // x보다 크면 right로 이동
x = x->right;
}
if (y == NULL) // the tree was empty
root = ins;
else if (ins->data < y->data)
y->left = ins;
else
y->right = ins;
}
다음 포스팅은 STL인 map을 사용하여 풀어도보도록 하겠습니다.
Leave a comment