atoi(s.c_str())
위의 코드를 통해서 진행 문자열을 숫자로 바꿀수 있다.
만약 문자열이 숫자로 변환되지 못하는 경우, 0이 return 된다.
기존의 map은 자동정렬에 의해서 find 탐색시간이 O(longN)이다. 하지만 unordered_map을 사용하면 O(1)에 가능!
추가적으로 아래와 같이 검색해야 하는 것을 잊지 말자.
if(m.find(s) == m.end()){ //map에 없으면
cout << p_array[atoi(s.c_str())] << "\n";
continue;
}
사실 이 부분 때문에 계속해서 시간 초과가 발생하였다.
입출력이 빈번하게 발생하는 문제의 경우 아래의 코드를 반드시 추가해 주도록 하자.
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL); // 이거 차이 엄청 크다
#include <iostream>
#include <map>
#include <string>
#include <unordered_map>
using namespace std;
int M, N;
string p_array[100010];
map<string,int> m;
string s;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL); // 이거 차이 엄청 크다
cin >> N >> M;
for(int i = 1; i <= N; i++){
cin >> p_array[i];
m[p_array[i]] = i;
}
// for(int j = 0; j < M; j++){
// cin >> s;
// if(m.find(s) == m.end()){ //map에 없으면
// cout << p_array[atoi(s.c_str())] << "\n";
// continue;
// }
// else cout << m[s]<< "\n";
// }
for(int j = 0; j < M; j ++){
cin >> s;
if(atoi(s.c_str()) == 0) cout << m[s] << "\n"; // 문자인경우
else cout << p_array[atoi(s.c_str())] << "\n";
}
}