map을 처음 사용하게 된 알고리즘으로 새로운 자료구조를 알게되어 좋았다. 문제를 해결해가며 문자가 숫자인지 아닌지 판단해주는
isdight()
함수를 새로 알게 되었다.
이 문제는 간단하게 Map 자료구조를 이용하여 해결할 수 있는 문제로 숫자를 입력하면 도감번호에 해당하는 포켓몬의 이름을 출력하고 이름을 입력하면 해당 포켓몬의 도감번호를 출력하는 문제이다.
처음에는 입력받은 명령이 숫자인지 포켓몬의 이름인지를 파악하기 위하여 문자열 전체를 탐색하는 방법을 채택하였다.
bool IsOnlyAlphabet(string value){
for(char ch : value){
if(!isalpha(ch))
return false;
}
return true;
}
하지만 명령이 숫자인지 포켓몬의 이름인지를 파악하기 위해서는 문자열의 가장 첫번째 문자가 숫자인지 문자인지만 판단해주면 된다는 것을 깨닫고 위에서 생각해낸 방법이 얼마나 멍청한 방법인지 깨닳았다..
실제로 위에 방법으로 구현시 명령이 들어올 때마다 반복문이 실행되니 시간초과 이슈가 생긴다
문자가 숫자인지 판단하여 주는 isdight()
함수를 알게되어 이것을 사용하였다.
#include<iostream>
#include<string>
#include<map>
using namespace std;
bool IsOnlyAlphabet(string value);
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int n, m;
cin >> n >> m;
map<string, int> pokemonMap;
string name[100000];
for(int i = 0; i < n; i++){ //insert PokeDex
string poketmonName = "";
cin >> poketmonName;
pokemonMap.insert({poketmonName, i});
name[i] = poketmonName;
}
for(int i = 0; i < m; i++){ //insert Problem
string problemInput;
cin >> problemInput;
if(isdigit(problemInput[0])){ //is number
cout << name[stoi(problemInput) - 1] << "\n";
}
else{
cout << pokemonMap.at(problemInput) + 1 << "\n";
}
}
}