승코딩당당당

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

PS/BOJ

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

승코딩당당당 2026. 3. 1. 23:51

문제

[C++] 백준 1620: 나는야 포켓몬 마스터 이다솜 SILVER 4
https://www.acmicpc.net/problem/1620

 


 

접근 방법

이 문제는 포켓몬 이름과 번호를 양방향으로 조회해야 하는 문제다.

 

즉,

  • 이름이 주어지면 → 번호 출력
  • 번호가 주어지면 → 이름 출력

이 두 가지를 모두 빠르게 처리해야 한다.

그래서 자료구조를 두 개로 나누어 사용했다.

  1. map<string, int>
    이름 → 번호를 저장
  2. vector<string>
    번호 → 이름을 저장

입력받을 때 포켓몬을 1번부터 차례대로 저장하면서 아래와 같이 두 자료구조에 동시에 기록한다.

dic[str] = i;      // 이름 → 번호
dic2.push_back(str); // 번호 → 이름

 

질의를 처리할 때는 입력이 문자열로 들어오므로,

  • 첫 글자가 숫자라면 → stoi로 정수 변환 후 vector에서 찾기
  • 알파벳이라면 → map에서 번호 찾기

이 방식으로 O(log N) 시간에 질의를 처리할 수 있다.

 

구현 시 주의할 점

  • 벡터는 0번 인덱스부터 시작하지만 포켓몬 번호는 1번부터 시작하므로 번호로 접근할 때 반드시 -1을 해줘야 한다.
  • 입력이 숫자인지 문자열인지 구분할 때 str[0]이 '0' ~ '9' 범위인지 확인하면 된다.
  • 질의 개수가 많을 수 있으므로 빠른 입출력 설정을 해주는 것이 안전하다.
  • map에서 dic[str]처럼 접근하면 존재하지 않는 키가 들어올 경우 기본값이 생성되지만,
    문제 조건상 항상 존재하는 값만 들어오므로 별도 처리는 필요 없다.
 

 


 

코드

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

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int n = 0, m = 0;
	cin >> n >> m;

	map<string, int> dic;
	vector<string> dic2;
	for (int i = 1; i <= n; i++)
	{
		string str = "";
		cin >> str;

		dic[str] = i;
		dic2.push_back(str);
	}
	for (int i = 0; i < m; i++)
	{
		string str = "";
		cin >> str;

		if ('0' <= str[0] && str[0] <= '9')
			cout << dic2[stoi(str) - 1] << '\n';
		else
			cout << dic[str] << '\n';
	}
}

'PS > BOJ' 카테고리의 다른 글

[C++] 백준 11689: GCD(n, k) = 1  (0) 2026.03.02
[C++] 백준 1016: 제곱 ㄴㄴ 수  (0) 2026.03.02
[C++] 백준 1991: 트리 순회  (0) 2026.02.27
[C++] 백준 16953: A → B  (0) 2026.02.27
[C++] 백준 1764: 듣보잡  (0) 2026.02.26