# 본인 코드

#include <bits/stdc++.h>
using namespace std;
int n, m;
string name[100000];
map<string, int> mp;
vector<string> ret;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    // 조건 0. 포켓몬 각 입력은 숫자 1부터 차례로 매핑된다.
    // 조건 1. 이름은 첫글자가 대문자이고 나머지는 소문자이다.
    // 조건 2. 마지막글자가 대문자일 수도 있다.
    // 조건 3. 포켓몬 글자 최대길이는 20자, 최소 2자이다

    cin >> n >> m;

    for (int i = 0; i < n; i++){
        cin >> name[i];

        mp[name[i]] = i;
    }

    for (int i = 0; i < m; i++){
        string input;
        cin >> input;

        // 포켓몬 이름이 입력됐을때
        if(input[0] >= 65 && input[0] <= 90){
            string s = to_string(mp[input] + 1);
            ret.push_back(s);
        } else {
            // 숫자가 입력되었을때 -> 숫자로 파싱해야됨
            if(atoi(input.c_str()) != 0){
                ret.push_back(name[atoi(input.c_str()) - 1]);
            }
        }
    }

    for(string elem: ret){
        cout << elem << "\n";
    }

    return 0;
}
  1. Map 자료구조와 배열을 사용했다.
  2. 배열은 숫자 입력시 포켓몬 이름을 출력하기 위한 용도이고, Map은 포켓몬 이름입력시 포켓몬 번호 출력을 위한 용도이다.
  3. atoi 를 통해 string -> int 변환을 하여 배열 인덱싱을 했고, to_string 메서드를 통해 포켓몬 번호를 문자열로 변환하였다. (string타입 벡터에 push_back 하기위해)

# 개선 코드

#include <bits/stdc++.h>
using namespace std;
int n, m;
string s;
map<string, int> mp;
// map<int, string> mp2;
string a[100004];

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

    cin >> n >> m;

    for (int i = 0; i < n; i++)
    {
        cin >> s;
        mp[s] = i + 1;
        // mp2[i+1] = s;
        a[i + 1] = s;
    }

    for (int i = 0; i < m; i++){
        cin >> s;
        if(atoi(s.c_str()) == 0){
            cout << mp[s] << "\n";
        }else{
            cout << a[atoi(s.c_str())] << "\n";
        }
    }

    return 0;
}
  1. Map 자료구조 두개를 사용해도 되고, 배열과 맵 두개를 혼용해서 사용해도 된다.