문제설명
입출력 예제
개념
문자열을 입력받아 숫자와 매칭시키는 문제다. 정해진 개수만큼 문자열 입력이 끝나면, 숫자를 입력했을 때 문자열을 출력하고, 문자열을 입력했을 때 숫자를 출력하면 된다. 따라서 2개의 값을 매칭시키는 문제이므로 map 자료구조를 이용해 주면 된다.
풀이
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
이 문제를 풀다 보면 시간 초과 문제가 빈번하게 일어난다. 따라서 이를 미연에 방지하기 위해 c언어와의 싱크를 해제해 주고, cin과 cout의 tie를 풀어 시간을 조금이라도 단축시켰다.
int n, m;
cin >> n >> m;
string name;
map<string, int> _map;
map<int, string> _map2;
포켓몬 문자열의 수 n과 문제의 개수 m을 초기화해준다. 그리고 앞서 <개념>에서 언급했듯이 도감 번호와 포켓몬 이름을 초기화할 map 자료 구조를 초기화해 준다.
여기서 중요한 포인트인데, map 자료 구조는 key 값으로 value를 찾는 건 빠르지만 value 값으로 key 값을 찾는 건 상대적으로 느리다. 따라서 map의 value값을 key로 받는 map을 하나 더 생성해 주었다.
for (int i = 0; i < n; i++)
{
cin >> name;
_map[name] = i + 1;
_map2[i + 1] = name;
}
map에 각각 값을 초기화해 준다.
for (int i = 0; i < m; i++)
{
cin >> name;
if (_map.find(name) != _map.end())
cout << _map[name] << '\n';
else
{
int index = stoi(name);
cout << _map2[index] << '\n';
}
}
}
포켓몬 도감에 데이터를 모두 삽입했으면, m개만큼 문제를 내도록 한다. 만약 문자열을 입력받았으면 _map[name]인 번호를 출력하게 하였고, 정수를 입력받으면 _map2[stoi(name)]인 문자열을 출력하게 구성하였다.
총합본
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int n, m;
cin >> n >> m;
string name;
map<string, int> _map;
map<int, string> _map2;
for (int i = 0; i < n; i++)
{
cin >> name;
_map[name] = i + 1;
_map2[i + 1] = name;
}
for (int i = 0; i < m; i++)
{
cin >> name;
if (_map.find(name) != _map.end())
cout << _map[name] << '\n';
else
{
int index = stoi(name);
cout << _map2[index] << '\n';
}
}
}
반응형
'Algorithm > 백준' 카테고리의 다른 글
[백준] 9375 with C++ (0) | 2023.02.24 |
---|---|
[백준] 1065 with C++ (0) | 2023.02.23 |
[백준] 1940 with C++ (0) | 2023.02.21 |
[백준] 3986 with C++ (0) | 2023.02.20 |
[백준] 1193 with C++ (0) | 2023.02.19 |