[백준 1620] 나는야 포켓몬 마스터 이다솜

백준 1620번 - 나는야 포켓몬 마스터 이다솜

백준 1620번

코딩 테스트 준비를 위해 알고리즘 문제 풀기를 시작했다.
제일 먼저 풀고 싶었던 문제인, 포켓몬스터 문제를 풀기로 했다.
사실 친한 형이 메신저로 이런 문제가 있다고 알려주었고, 재밌어보여 풀게 되었다.

앞으로 종종 문제를 풀고 풀이를 올릴 생각이다.
그리고 백준 계정도 새로 팠다.

아! 참고로 나는 c++로 문제를 풀 예정이다.


❓ 문제

너무 길다… 직접 확인하도록 하자.


✏️ 풀이

너무 오랜만이라 vector, map, pair 등 STL 문법도 까먹고 찾아보는데 시간을 많이 썼다.

우선, 이 문제를 보았을 때, Python의 Dictionary, c++의 map이 가장 먼저 떠올랐다.

Key 값으로 Value를 찾고, 또 Value값으로 Key를 찾는 문제였다.

입력으로 포켓몬 이름을 쭉 받아 list를 생성한다.
그 후, 포켓몬 이름을 입력으로 받으면 출력으로 list에서 해당 포켓몬의 index 번호를, 반대로 index 번호를 입력으로 받으면 list에서 포켓몬 이름을 출력을 요구했다.

나는 map<string, int>로 변수를 선언하고, vector을 하나 더 선언해주었다. 그 이유는 map에서 포켓몬 이름이 key가 되고, index 번호가 value가 될 때, 포켓몬 이름으로 index 번호를 find할 수 있다. 그렇다면, 이 value값을 가지고 vector의 index에 접근하면 포켓몬의 이름을 얻을 수 있다고 생각했기 때문이다.

즉, input : 포켓몬 이름 -> output : index 번호 map 사용
input : index 번호 -> output : 포켓몬 이름 vector 사용

결과는 성공
result


✔️ 정답 코드

#include <iostream>
#include <map>
#include <vector>
#include <cctype>
#include <cstdlib>
#include <string>

using namespace std;

vector<string> answer(map<string, int> dict, int M, vector<string> dict_arr);
bool isDigit(string temp);

int main(void) {
	ios_base::sync_with_stdio(0);
	cout.tie(0);
	cin.tie(0);

	int N, M; // N : 포켓몬 개수, M : 문제의 개수 
	string temp;
	map<string, int> dict;
	vector<string> dict_arr;

	cin >> N >> M;

	for (int i = 0; i < N; i++) {
		cin >> temp;
		dict.insert(pair<string, int>(temp, i)); // 찾기 쉽게 string을 key로 index를 반환하게끔 만들어줌
		dict_arr.push_back(temp); // 배열 하나를 추가
	}

	vector<string> result = answer(dict, M, dict_arr);

	for (int i = 0; i < result.size(); i++) {
		cout << result[i] << "\n";
	}

	return 0;
}

vector<string> answer(map<string, int> dict, int M, vector<string> dict_arr) {
	string temp;
	vector<string> result;

	for (int i = 0; i < M; i++) {
		cin >> temp;
		if (isDigit(temp)) { // 숫자면
			result.push_back(dict_arr[stoi(temp)-1]);
		}
		else { // 문자면
			result.push_back(to_string((dict.find(temp)->second)+1));
		}
	}

	//for (int i = 0; i < result.size(); i++)
	//	cout << result[i] << "\n";

	return result;
}

bool isDigit(string temp) {
	for (int i = 0; i < temp.length(); i++) {
		if (!isdigit(temp[i]))
			return false;
	}
	return true;
}

😑 어려웠던 부분

너무 오랜만에 문제를 풀어 감을 잃었던 것 같다..

cout << result[i]

위와 같이 print를 해야하는데, result만 써버려서 1시간을 날렸다.
친한 형이 코드 리뷰를 하다가 발견했는데 덕분에 index부분을 넣을 수 있었다….

교훈 : 꼼꼼히 잘 보자..

Leave a comment