본문 바로가기
백준

[1620] 나는야 포켓몬 마스터 이다솜

by kmyobin 2022. 7. 27.

 


일단 도감 순서와 문자열 알파벳 순서가 일정하게 정렬되어있지 않다

key값으로 정렬하면 문자열이 정렬이 안되고, value로 정렬하면 도감 순서가 뒤죽박죽이 되었다

map을 사용하니 시간초과가 발생하였다

 

그래서 찾는 시간이 빠르다는 unordered_map을 사용했다

hash map이랑 유사하다고 보면 된다

 


map보다 빠른 탐색이 가능하며, 시간복잡도는 O(1)이다

중복된 데이터를 허용하지 않는다


 

unordered_map 2개를 사용하였는데 결론적으로 보면 그냥 구조체 배열 2개를 써도 괜찮았을 거라는 생각이 든다

key가 숫자인 경우key가 문자열인 경우를 나눠 unordered_map 2개를 사용하였다

 

 

myunorderedmap1 : key가 숫자임. 도감순서로 포켓몬 이름을 찾을 때 사용

myunorderedmap2 : key가 문자열임. 포켓몬 이름으로 도감순서를 찾을 때 사용

 

 

찾는 과정에서 input이 숫자인 경우 포켓몬 이름인 문자열을 출력해야한다

input이 문자열이면 도감 순서인 숫자를 출력해야한다

 

그러므로 isNumber(input)가 true면 myunorderedmap1을 사용하여 해당 도감 순서의 포켓몬 이름을 출력하고,

false면 myunorderedmap2를 사용하여 해당 포켓몬 이름의 도감 순서를 출력하였다

 

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;

int N, M;

unordered_map<int, string> myunorderedmap1;
unordered_map<string, int> myunorderedmap2;

bool isNumber(const string& str) {
	for (char const& c : str) {
		if (isdigit(c) == 0)return false;
	}
	return true;
}

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

	cin >> N >> M;
	for (int i = 0; i < N; i++)
	{
		string input;
		cin >> input;
		myunorderedmap1.insert({ i + 1, input }); // key가 숫자인 경우
		myunorderedmap2.insert({ input, i + 1 }); // key가 문자열인 경우
	}

	for (int i = 0; i < M; i++)
	{
		string input;
		cin >> input;
		if (isNumber(input)) { // 숫자로 입력되면 문자열 출력
			printf("%s\n", myunorderedmap1[stoi(input)].c_str());
		}
		else { // 문자열로 입력되면 숫자 출력
			printf("%d\n", myunorderedmap2[input]);
		}
	}
}

'백준' 카테고리의 다른 글

[1764] 듣보잡  (0) 2022.07.29
[10816] 숫자 카드 2  (0) 2022.07.29
[14425] 문자열 집합  (0) 2022.07.27
[10815] 숫자 카드  (0) 2022.07.27
[18870] 좌표 압축  (0) 2022.07.22

댓글