||문제 이해

포켓몬 도감 리스트가 주어지고

 

오박사가 번호를 물어보면 포켓몬의 이름을 출력,

오박사가 포켓몬의 이름을 물어보면 번호를 출력 하라.


||해결 계획

모두 직감적으로 느끼겠지만 이건 map이다.

 

하나 좀 고민했던게 있는데 map의 key는 하나다.

하지만 문제는 key를 번호, 이름 두가지로 묻고있다.

 

좀 고민하다가 나는 다 저장하기로 했다 ㅋㅋㅋ

map<string, string> 형식으로

{"1", "피카츄"}

{"피카츄","1"}

이렇게 번호도 string화 해서 map에 두번 저장하기로 했다.


||구현

#include <bits/stdc++.h>
#include <unordered_set>
using namespace std;

unordered_map<string,string> dogam;

int main()
{
	ios::sync_with_stdio(0), cin.tie(0);

	int n, m; cin >> n >> m;
	for (int i = 1; i <= n; ++i)
	{
		string str; cin >> str;
		dogam.insert({str, to_string(i)});
		dogam.insert({to_string(i), str});
	}

	while (m--)
	{
		string str; cin >> str;
		cout << dogam.find(str)->second << '\n';
	}

	return 0;
}

||되돌아보기

다른 코드들도 보니 이런식으로 두번 저장하여 풀이하는듯 했다.

문제 읽는게 재미있었던 문제


||개선 코드

#include <bits/stdc++.h>
#include <unordered_set>
using namespace std;

unordered_map<string,string> dogam;
string dogam2[1'000'005];

int main()
{
	ios::sync_with_stdio(0), cin.tie(0);

	int n, m; cin >> n >> m;
	for (int i = 1; i <= n; ++i)
	{
		string str; cin >> str;
		dogam.insert({ str, to_string(i) });
		dogam2[i] = str;
	}

	while (m--)
	{
		string str; cin >> str;
		if(isdigit(str[0]))
			cout << dogam2[stoi(str)]<< '\n';
		else
			cout << dogam.find(str)->second << '\n';
	}

	return 0;
}

 

map에서 숫자를 키로 받는 부분을 string배열을 만들어 따로 저장했다.

아무래도 탐색부분에 있어서 인덱스 참조는 O(1)이니까 훨씬 빨랐다.

 

그리고 이번에 알게된건데 isdigit은 int형을 반환한다. 반환 값이 0, 1뿐만 아니라 4 ,6이런게 나올수도 있다는 말이다.

그래서 if (isdigit(3) == true) 는 컴파일오류는 나지 않지만 원하는 결과가 나오지 않는다.

 

+ Recent posts