||문제 이해
포켓몬 도감 리스트가 주어지고
오박사가 번호를 물어보면 포켓몬의 이름을 출력,
오박사가 포켓몬의 이름을 물어보면 번호를 출력 하라.
||해결 계획
모두 직감적으로 느끼겠지만 이건 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) 는 컴파일오류는 나지 않지만 원하는 결과가 나오지 않는다.
'코딩 테스트 > 알고리즘 풀이' 카테고리의 다른 글
[알고스팟 - TRIANGLEPATH] 삼각형 위의 최대 경로 (0) | 2023.01.08 |
---|---|
[알고스팟 - QUADTREE] 쿼드 트리 뒤집기 (0) | 2022.12.10 |
[종만북] 행렬의 거듭제곱 (0) | 2022.12.07 |
[백준 - 15685] 드래곤 커브 (0) | 2022.12.06 |
[종만북] 수열의 빠른 합 (0) | 2022.12.06 |