코딩테스트

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

5_솔방울 2022. 11. 11.

https://www.acmicpc.net/problem/1620

 

1620번: 나는야 포켓몬 마스터 이다솜

첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면

www.acmicpc.net

그럼 다솜아 이제 진정한 포켓몬 마스터가 되기 위해 도감을 완성시키도록 하여라. 일단 네가 현재 가지고 있는 포켓몬 도감에서 포켓몬의 이름을 보면 포켓몬의 번호를 말하거나, 포켓몬의 번호를 보면 포켓몬의 이름을 말하는 연습을 하도록 하여라. 나의 시험을 통과하면, 내가 새로 만든 도감을 주도록 하겠네.

 

이 문제는 들어오는 포켓몬의 이름을 저장시키고, 추후 이름이나 번호가 입력되면 그에 대응되는 번호나 이름이 출력되도록 구현해야 하는 문제이다. 이 문제는 백준 1302번과 마찬가지로 map을 사용하면 굉장히 편리한 문제이다.

문제의 포인트

map을 한 개가 아닌 두개를 사용하는 것에 대한 아이디어를 떠올렸는가?

설명

받은 입력을 map에 받아주고, 그 후 찾고자 하는 값에 따라 map에서 value를 받아오면 된다.

 

map은 key로 value를 찾는 것은 간편하나, value로 key를 찾는 것은 전자에 비해 좀 더 복잡한 과정을 거쳐야 한다. 그렇기에 map을 두 개 생성하여 각각 대응되는 value를 찾아주면 간단하게 풀리는 문제이다.

코드

#include <iostream>
#include<string>
#include<map>
#include<vector>
using namespace std;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int monsterIdx, answerIdx;
	cin >> monsterIdx >> answerIdx;

	map<string, int> monsterMap;
	map<int, string> monsterIDX;
	string str;
	vector<string> answers;
	int it = 1;
	for (int i = 0; i < monsterIdx; i++)
	{
		cin >> str;
		monsterMap.insert({ str, it });
		monsterIDX.insert({ it++, str });
	}

	string ans;
	for (int i = 0; i < answerIdx; i++)
	{
		cin >> ans;
		if (isdigit(ans[0])) //숫자 입력됨
		{
			answers.push_back(monsterIDX[stoi(ans)]); //그에 대응되는 이름을 넣는다.
		}
		else //문자 입력됨
		{
			answers.push_back(to_string(monsterMap[ans])); //그에 대응되는 번호를 넣는다.
		}
	}
	for (int i = 0; i < answers.size(); i++)
	{
		cout << answers[i] << '\n';
	}
}

여담

문제가 정말... 컨셉에 잡아먹힌 문제이다. ㅋㅋㅋ 입력과 출력, 예시까지 완벽하다 정말

그리고 이 문제 또한 삽질을 엄청나게 하였다.. 아직 map에 대한 이해도가 완벽하지 않은 것 같다.

대소문자가 관련이 있을 줄 알고 엄청나게 예외처리를 했었는데... 오히려 그것 때문에 시간을 허비했다.

알고리즘 풀이를 쉬어서 그런가..? 꾸준히 풀고 푼 것들도 열심히 정리해놓아야겠다.

'코딩테스트' 카테고리의 다른 글

백준 1027번 게임 C++풀이  (0) 2022.11.29
백준 5430번 AC C++ 풀이  (0) 2022.11.22
백준 10799번 쇠막대기 C++ 풀이  (0) 2022.11.21
백준 2504 괄호의 값 C++ 풀이  (0) 2022.11.09
백준 1302 베스트셀러 C++ 풀이  (0) 2022.11.09

댓글