본문 바로가기
코딩테스트 준비/백준

[백준 1620번][C++] 나는야 포켓몬 마스터 이다솜

by 스테디코디스트 2023. 7. 21.
반응형

<문제 소개>


<소스 코드>

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <map>
#include <cmath>
#include <stack>
#include <queue>
#include <algorithm>
#include <cstdlib>
using namespace std;

int main()
{
	// 쓰레드 환경이 아닐때 버퍼를 분리하여 처리속도를 빠르게 해줌
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N, M;
	cin >> N >> M;
	
	map<int, string> book1; // 도감1 -> 번호로 이름찾기
	map<string, int> book2; // 도감2 -> 이름으로 번호찾기

	for (int num = 1; num <= N; num++)
	{
		string name;
		cin >> name;

		book1.insert({ num,name });
		book2.insert({ name,num });
	}

	vector<string> v;

	for (int i = 0; i < M; i++)
	{
		string number_or_name;
		cin >> number_or_name;

		v.push_back(number_or_name);
	}

	for (int i = 0; i < v.size(); i++)
	{
		// 첫번째 글자가 숫자인지 문자인지 판단
		if (v[i][0] > '0' && v[i][0] <= '9')
		{
			// 숫자가 입력된 경우
			int number = stoi(v[i]);
			cout << book1[number] << "\n";
		}
		else
		{
			// 문자가 입력된 경우
			string name = v[i];
			cout << book2[name] << "\n";
		}
	}

	return 0;
}

<풀이과정>

1. N과 M을 입력받고, 번호로 이름을 찾을 map<int, string> 형 book1과 이름으로 번호를 찾기위한 map<string, int> 형 book2를 각각 선언한다.

2. 1부터 N까지 반복하면서 이름을 받아와 두가지의 도감에 각각 {번호, 이름}, {이름, 번호} 쌍으로 넣어준다.

3. 벡터 v를 선언하여 M만큼 입력을 받으면서 string형으로 문제를 하나씩 v에 추가해준다.

4. 벡터 v의 원소를 돌면서 첫번째 글자가 '0'과 '9' 사이인지를 판단하여 숫자인 경우와 문자인 경우로 구분한다.

5. 숫자인 경우, stoi를 이용해 int형으로 해당 문자를 바꿔주고, book1에서 바꾼 number를 키값으로 하여 이름을 찾아서 출력한다.

6. 문자인 경우, book2에서 해당 문자를 그대로 키값으로 하여 번호를 찾아 출력한다.


<코멘트>

문제 소개에는 없지만 원래 문제에는 줄거리가 나와있다ㅋㅋㅋ

재밌?기도 하니 읽어보실 분들은 여기로 들어가시면 됩니당ㅋㅋㅎㅋ

 

출력 종류가 2개라서 살짝 헷갈렸는데 map 2개를 선언하여 야무지게 풀었다!

근데 시간이 오래 걸린게 맘에 걸려서 다른 풀이를 찾아보았는데 내 풀이가 괜찮은 풀이인 것 같다!ㅋㅋ

 

참고
다른 분들의 코드들을 보니 다들 아래의 코드를 먼저 쓰시길래 뭔지 알아봤다.

아래의 코드는 쓰레드 환경이 아닐때 버퍼를 분리하여 처리속도를 빠르게 해주는 역할을 하는 것이라 한다.ㅇㅅㅇ
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);

<제출결과>

위는 코드를 이용해 버퍼를 분리?한 경우 -> 확실히 빨라지긴 하는듯