[백준(BOJ)] 나는야 포켓몬 마스터 이다솜(1620번)_C++
2023. 3. 12. 16:25ㆍProblem Solving/Algorithm & Data Structure
728x90
반응형
SMALL
자료구조 map을 이용하면 쉽게 해결할 수 있을 줄 알았다.
문제에서 입력이 숫자로 주어지거나 문자로 주어질 수 있다.
만일 map<int, string> 을 사용하다 가정하자.
입력으로 숫자가 주어지면 find() 함수를 이용해 O(log n)으로 굉장히 빠른 시간내에 번호에 해당하는 이름을 알 수 있다.
반대로 문자가 주어지면 for문으로 iterator를 통해 각각의 데이터에 접근해야 한다.
때문에 O(n)으로 굉장히 늦게 정답을 구해내고, 모든 입력이 문자로만 주어진다면 O(mn)으로 시간초과가 발생한다.
이를 해결하고자 나는 <번호, 이름>, <이름, 번호> 인 map 2개를 선언했다.
입력으로 무엇이 들어오든 O(log n) 만에 정답을 찾아낼 수 있어서 시간초과가 발생하지 않는다.
추가적으로 atoi() 함수를 사용할 때 인자로 string을 그대로 넘기면 컴파일 에러가 발생한다.
atoi() 함수의 인자는 const char * 형이므로 string 형을 인자로 받을 수가 없다.
때문에 문자열의 첫번째 문자의 주소를 넘겨주면 정상적으로 사용할 수 있다.
#include <iostream>
#include <map>
using namespace std;
int n, m;
map<int, string> dict1;
map<string, int> dict2;
int main(){
cin.tie(NULL);
cout.tie(NULL);
ios_base::sync_with_stdio(false);
//input
cin >> n >> m;
for(int i = 1; i <= n; i++){
string s;
cin >> s;
dict1.insert({i, s});
dict2.insert({s, i});
}
//find answer
while (m--){
string s;
cin >> s;
int num;
string name;
if (s[0] >= '0' && s[0] <= '9'){ //input is number
num = atoi(&s[0]);
name = (*dict1.find(num)).second;
//output
cout << name << "\n";
}
else{ //input is character
name = s;
num = (*dict2.find(name)).second;
//output
cout << num << "\n";
}
}
}728x90
반응형
LIST
'Problem Solving > Algorithm & Data Structure' 카테고리의 다른 글
| [백준(BOJ)] 가장 긴 증가하는 부분 수열 2(12015번)_C++ (0) | 2023.03.17 |
|---|---|
| [백준(BOJ)] 웜홀(1865번)_C++ (0) | 2023.03.14 |
| 백준(BOJ)_도시 분할 계획(1647번)_C++ (0) | 2023.03.01 |
| 백준(BOJ)_최소 스패닝 트리(1197번)_C++ (0) | 2023.03.01 |
| 백준(BOJ)_외판원 순회(2098번)_C++ (0) | 2023.02.26 |