Algorithm/백준

[백준] 1620 with C++

nowkoes 2023. 2. 22. 15:13

문제설명


입출력 예제

 


개념

 문자열을 입력받아 숫자와 매칭시키는 문제다. 정해진 개수만큼 문자열 입력이 끝나면, 숫자를 입력했을 때 문자열을 출력하고, 문자열을 입력했을 때 숫자를 출력하면 된다. 따라서 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