[c++] 백준 1620 : 나는야 포켓몬 마스터 이다솜

728x90

[c++] 백준 1620 : 나는야 포켓몬 마스터 이다솜

🥈실버 4

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

 

1620번: 나는야 포켓몬 마스터 이다솜

첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면

www.acmicpc.net


접근

이름으로 번호를 , 번호로 이름을 뽑아내야 한다.

각각의 경우에 해당하는 map을 두개 만들거나,

string -> int map과 string 배열을 활용하는 방법으로 구현할 수 있다.

 

입력값은 정수 또는 문자열이 될 수 있기에, c++에서는 string형으로 문자열을 받아 이것이 정수인지 문자열인지 판별하는 메서드를 활용하는 방법을 사용해야 했다.

 

주요 키워드

isdigit, stoi, stringstream

unordered_map

 

map을 두번 사용한 코드

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

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    unordered_map<string, int> m;
    unordered_map<int, string> m2;
    int N, M;
    cin >> N >> M;
    for (int i = 1; i <= N; i++){
        string name;
        cin >> name;
        m[name] = i;
        m2[i] = name;
    }
    while(M--) {
        string input;
        cin >> input;
        stringstream ss(input);
        int num;
        if(ss >> num) {
            cout << m2[stoi(input)] << '\n';
        }
        else cout << m[input] << '\n';
    }
    return 0;
}

stringstream 객체를 ss라는 이름으로 생성하고, ss >> num을 통해 입력받은 문자열로 부터 정수를 추출하여 num에 할당하려는 시도를 할 수 있다. 가능 여부를 true나 false로 반환하기 때문에 정수를 입력받았는지, 문자열을 입력 받았는지에 대한 처리가 가능하다.

true의 경우에는 num에 정수값이 담기기 때문에, m2[stoi(input)] 대신 m2[num]을 사용해도 무방하다.

 

 

map과 배열을 함께 사용한 코드

#include <bits/stdc++.h>
using namespace std;
string arr[100002];
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    unordered_map<string, int> m;
    

    int N, M;
    cin >> N >> M;

    for (int i = 1; i <= N; i++){ 
        cin >> arr[i];
        m[arr[i]] = i;
    }
    for (int i = 1; i <= M; i++) {
        string val;
        cin >> val;
        if (isdigit(val[0])) {
            cout << arr[stoi(val)] << '\n';
        }
        else cout << m[val] << '\n';
    }
    return 0;
}

isdigit는 인수로 들어오는 값이 문자형일 때 이것이 정수인지 그냥 문자인지를 판별하는 메서드이다.

입력값에는 25나 100같은 긴 정수가 올 수 있기 때문에 char 자료형으로 값을 받을 수가 없다.

string으로 값을 입력받는 대신, 가장 앞 자리 요소만 따면 char형으로 받아올 수 있기 때문에 isdigit 메서드를 활용할 수 있었다.

 

stoi는 string 자료형을 int로 반환하는 것이므로 isdigit가 true일 경우 입력받은 값을 정수로 반환하여 필요한 값을 가져올 수 있다.

728x90