본문 바로가기

알고리즘/백준

[백준/C++] 알고리즘 1620번 - 나는야 포켓몬 마스터 이다솜

 

안녕하세요! 테크지니어22입니다.

오늘은 백준 알고리즘 1620번 - 나는야 포켓몬 마스터 이다솜 문제를 풀어보도록 하겠습니다.

 

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

 

 

[문제 접근]

-  이름에 대응되는 숫자를, 숫자에 대응되는 이름을 출력하는 문제입니다.

- n과 m이 10만이하이고, 시간제한이 2초이기 때문에 시간복잡도 O(N)이나 O(NlogN)이 통과할 거 같습니다.

 

[풀이 전략]

- 해시맵 두 개를 이용하여 풀었습니다.

- 문자열이 숫자인지 아닌지 판별하는 함수를 작성했습니다.

 

[코드]

#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <cctype>
using namespace std;


bool isNumber(string str) {
    for(auto c: str) {
        if(!isdigit(c)) return false; 
    }
    return true;
}

int main() {
  ios::sync_with_stdio(0);
    cin.tie(0); 
    int n, m ;
    cin >> n >> m ;
    unordered_map<int,string> m1 ;
    unordered_map<string,int> m2 ;

    for(int i = 0 ; i < n ; i++){
        string name ;
        cin >> name ;
        m1[i+1] = name ;
        m2[name] = i+1 ;
    }
    for(int i = 0 ; i < m ; i++) {
        string quiz ;
        cin >> quiz; 

        if(isNumber(quiz)) {
            cout << m1[stoi(quiz)] << '\n';
        } else {
            cout << m2[quiz] << '\n';
        }
        
    }
 
}

 

[개선점]

- 해시맵보다 배열이 더 빠르기 때문에 숫자에 대응되는 이름을 저장하는 자료구조는 배열로 교체하는 게 더 좋습니다.

- 문자열이 숫자인지 판별하는 함수를 작성했는데, 이번 문제에서는 문자열 첫번째인덱스만 숫자인지 아닌지만 판별해도 답을 구할 수 있습니다.