문자열로 숫자 판별하는 방법을 찾아보니 c++에 적합한 함수가 따로 있지 않았다.
indigit 함수는 문자 하나만 판별하는 것이고, c의 atoi 함수로도 판별하는 방법이 있다.
이번에는 string 의 stoi 함수를 사용하기로 했다. stoi의 함수는 int로 변환이 힘들 경우 예외를 반환하는데 이를 이용해서 숫자를 판별하는 함수를 만들 수 있다.
이는 아래의 블로그에서 찾은 코드이다.
또한 c++의 map 컨테이너를 사용해서 빠르게 서치할 수 있도록 했다. 하나의 맵을 사용해서 <int, string> 구조로 저장하려고 했는데, 값으로 키를 찾는 방법은 따로 구현을 해주어야 했다. 메모리 조건을 보니 생각보다 널널해서 map 두 개로 처리했다.
#include <iostream>
#include <map>
#include <string>
using namespace std;
map <int, string> intKey;
map <string, int> stringKey;
bool check_number(string s) {
try {
stoi(s);
}
catch (const invalid_argument& e) {
return false;
}
catch (const out_of_range& e) {
return false;
}
return true;
}
int main()
{
cin.tie(NULL);
cout.tie(NULL);
ios::sync_with_stdio(false);
int N, M;
cin >> N >> M;
for (int i = 1; i <= N; i++)
{
string tmp;
cin >> tmp;
intKey.insert(make_pair(i, tmp));
stringKey.insert(make_pair(tmp, i));
}
for (int i = 0; i < M; i++)
{
string tmp;
cin >> tmp;
if (check_number(tmp))
{
cout << intKey[stoi(tmp)] << '\n';
}
else
{
cout << stringKey[tmp] << '\n';
}
}
}