STUDY/코딩테스트 연습(PS)

백준/1620번, 포켓몬 마스터/C++

hyunah 2021. 4. 24. 14:33

백준 1620번 '나는야 포켓몬 마스터 이다솜'




문제 설명

포켓몬의 번호와 포켓몬의 이름을 저장해둔 후, 문제에서 포켓몬의 이름이 주어지면 그 포켓몬의 번호를 출력하고, 포켓몬의 번호가 주어지면 이름을 출력해야 하는 문제이다.
첫 번째 줄에는 포켓몬의 개수 N과 맞추어야 하는 문제 개수 M이 주어지고, 이어서 N줄에 걸쳐 1번부터 N번까지의 포켓몬 이름이 주어진다. 그 후에는 이어서 M줄에 걸쳐 포켓몬의 이름 혹은 번호가 주어진다.



주의할 점

  1. 포켓몬 개수의 최대범위가 10만이기 때문에, 시간초과에 유의해야 한다.
  2. 포켓몬 번호는 1번부터 N번까지이다.


코드

#include<iostream>
#include<map>

using namespace std;

map<string,int> s;
map<int,string> s2;

int N, M;

int main(void){
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);

  cin >> N >> M;

  for(int i = 0; i<N; i++){
    string j;
    cin >> j;
    s.insert(make_pair(j,i+1));
    s2.insert(make_pair(i+1,j));
  }

  for(int i = 0; i<M; i++){
    string x;
    cin >> x;
    int y = atoi(x.c_str()); //string to int. 변환할 수 없다면 0 반환

    if(y){
      cout << s2.find(y)->second << '\n';
    }
    else {
      cout << s.find(x)->second << '\n';
    }
  }
}


디버깅 기록

처음에는 배열이나 vector를 사용하려고 해봤지만 시간초과의 문턱을 넘지 못하여 포기했다.map을 사용하려고 보니 find 멤버 함수는 key값만 사용할 수 있어서 value가 주어지는 경우를 for문으로 처리할까 고민하다가 map을 하나 더 생성하였다.