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

 

지문이 엄청 길지만, 핵심은 마지막에 있다.

포켓몬 이름을 대면 그에 대응되는 숫자를

숫자를 대면 그에 대응되는 이름을 리턴해주면 된다.

 

그런데 경우의 수가 생각보다 크다.

포켓몬 개수는 1 ~ 10만

내가 맞춰야 하는 개수(쿼리의 수)도 1 ~ 10만

 

문자열을 숫자로 바꾸는 것

숫자를 문자열로 바꾸는 것

그런데 생각해 보면 둘 다 문자열로 저장해도 상관없다.

그래서 저장할 때에는 둘 다 문자열로 저장한다.

 

쿼리의 수가 최대 10만이니, 어떤 포켓몬 이름이나 숫자를 물어보더라도 빠르게 찾아서 리턴해줘야 하므로

unordered_map(정렬되지 않은 맵 = 해시맵)을 사용해서 find를 O(1)에 찾을 수 있도록 한다.

 

그런데, ios_base::sync_with_stdio(false)를 통해서 scanf, cin의 동기화를 꺼줘야 아슬아슬하게 시간 초과를 면할 수 있다.

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

int n, m;
string s;
unordered_map<string, string> mp;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        cin >> s;
        mp[s] = to_string(i);
        mp[to_string(i)] = s;
    }
    
    for (int i = 1; i <= m; i++)
    {
        cin >> s;
        cout << mp[s] << '\n';
    }
    return 0;
}

'Algorithm' 카테고리의 다른 글

[백준 2559] 수열  (0) 2024.08.16
[백준 9375] 패션왕 신해빈  (0) 2024.08.16
[백준 9996] 한국이 그리울 땐 서버에 접속하지  (0) 2024.08.16
[백준 11655] ROT 13  (0) 2024.08.15
[백준 11051] 이항 계수 2  (0) 2022.01.11

+ Recent posts