[BOJ]1620-나는야 포켓몬 마스터 이다솜

yoon_H·2024년 9월 15일

BOJ

목록 보기
95/110

1620

문자열로 숫자 판별하는 방법을 찾아보니 c++에 적합한 함수가 따로 있지 않았다.
indigit 함수는 문자 하나만 판별하는 것이고, c의 atoi 함수로도 판별하는 방법이 있다.
이번에는 string 의 stoi 함수를 사용하기로 했다. stoi의 함수는 int로 변환이 힘들 경우 예외를 반환하는데 이를 이용해서 숫자를 판별하는 함수를 만들 수 있다.

이는 아래의 블로그에서 찾은 코드이다.

또한 c++의 map 컨테이너를 사용해서 빠르게 서치할 수 있도록 했다. 하나의 맵을 사용해서 <int, string> 구조로 저장하려고 했는데, 값으로 키를 찾는 방법은 따로 구현을 해주어야 했다. 메모리 조건을 보니 생각보다 널널해서 map 두 개로 처리했다.

성공코드

#include <iostream>
#include <map>
#include <string>
using namespace std;

map <int, string> intKey;
map <string, int> stringKey;

bool check_number(string s) {
	try {
		stoi(s);
	}
	catch (const invalid_argument& e) {
		return false;
	}
	catch (const out_of_range& e) {
		return false;
	}
	return true;
}

int main()
{
	cin.tie(NULL);
	cout.tie(NULL);
	ios::sync_with_stdio(false);

	int N, M;
	
	cin >> N >> M;

	for (int i = 1; i <= N; i++)
	{
		string tmp;
		cin >> tmp;

		intKey.insert(make_pair(i, tmp));
		stringKey.insert(make_pair(tmp, i));
		
	}

	for (int i = 0; i < M; i++)
	{
		string tmp;

		cin >> tmp;

		if (check_number(tmp))
		{
			cout << intKey[stoi(tmp)] << '\n';
		}
		else
		{
			cout << stringKey[tmp] << '\n';
		}


	}
}

참고자료


숫자 판별
Map 접근

0개의 댓글