-
unordered_map 사용방법, c++ 시간단축코드 , stoi , 입력값 정수인지 문자열인지 구분하기 , 백준 1620, 나는야 포켓몬 마스터 이다솜알고리즘/백준 2023. 8. 29. 14:51
https://www.acmicpc.net/problem/1620
1620번: 나는야 포켓몬 마스터 이다솜
첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면
www.acmicpc.net
포켓몬 도감 문제이다.
처음 n개의 수 만큼 입력을 받아서 순서대로 포켓몬의 이름을 입력받은 후에 , n개만큼 입력이 끝나면 m번만큼 포켓몬의 이름이나, 포켓몬 등록 순서를 알기위한 문제인데, 이를 위해서 map을 사용하는 것을 생각했다.
#include <map> map<int,string>myMap; map<string,int>myKey; for(int i=1 ; i<=n ; i++) { string str; cin >> str; myMap[i] = str; myKey[str] = i ; }
이렇게 두개의 맵을 생성해서 myMap 은 key 가 int i 가 될수 있도록 즉, 순서가 될 수 있도록 입력했고, myKey 는 입력한 문자열이 key가 될 수 있도록 맵을 두개를 생성했다.
검증은
for(int i=0; i<m; i++) { string s; cin >> s; try { int num = stoi(s); cout<< myMap[num] << "\n"; } catch (const exception) { cout << myKey[s]<<"\n"; } }
m 번만큼 입력받아서 stoi를 통해서 문자열이 정수화가 가능하다면 try 하여 myMap 을 호출해주고, 오류가 난다면 , myKey 를 사용해 문자열로 value를 찾아주어 해결할 수 있었다.
하지만 시간초과 이슈 ..
정답은 제대로 나오지만 계속되는 시간초과로 문제점을 찾아보았는데,
1. key 를 이용해서 찾는거라면 속도는 unordered_map 을 사용하는 것이 유리하다.
2. cin 을 통해 입력을 받을거면 아래와 같이 최적화를 해주자.
std::ios_base::sync_with_stdio(false); cin.tie(NULL);
이 점을 참고해 시간초과 이슈를 해결할 수 있었다 !
#include <iostream> #include <algorithm> #include <string> #include <vector> #include <unordered_map> using namespace std; int main() { std::ios_base::sync_with_stdio(false); cin.tie(NULL); unordered_map<int,string>myMap; unordered_map<string,int>myKey; int n,m ; cin >> n >> m ; for(int i=1 ; i<=n ; i++) { string str; cin >> str; myMap[i] = str; myKey[str] = i ; } for(int i=0; i<m; i++) { string s; cin >> s; try { int num = stoi(s); cout<< myMap[num] << "\n"; } catch (const exception) { cout << myKey[s]<<"\n"; } } }
'알고리즘 > 백준' 카테고리의 다른 글
백준 4375 : 1. 모듈러 연산 2 (0) 2023.08.31 백준 1629 곱셈 , 모듈러 연산 , 재귀함수 (0) 2023.08.31 [백준] 9996 한국이 그리울땐 서버에 접속하지, substr , find, length , string 사용방법 (1) 2023.05.19