[백준 BOJ] 1620번 나는야 포켓몬 마스터 이다솜 (C++/cpp)

2023. 1. 11. 17:02PS (Program Solving)/BOJ (백준)

문제 설명

https://www.acmicpc.net/problem/1620

 

1620번: 나는야 포켓몬 마스터 이다솜

첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면

www.acmicpc.net

백준 BOJ 1620번 나는야 포켓몬 마스터 이다솜 문제 사진1
문제 중간 생략(문제가 길다 다솜아)
백준 BOJ 1620번 나는야 포켓몬 마스터 이다솜 문제 사진2
백준 BOJ 1620번 나는야 포켓몬 마스터 이다솜 문제 사진3

 

접근 방법 - 맵과 벡터를 이용한 탐색 문제

백준의 1620번 문제는 맵과 벡터를 함께 이용하여 해결해야 하는 문제이다.

해당 문제는, 입력받은 포켓몬 도감에 대하여 도감 번호나 포켓몬 이름이 문제로 주어질 때 그에 알맞은 답을 출력해야 하는 문제이다.

이 문제는 숫자 인덱스를 통해 값을 추출하는 방법과 문자열 인덱스를 통해 값을 추출하는 방법이 모두 필요하다.

따라서 해당 문제에선, 배열 또는 벡터와 "맵"이 반드시 필요하다고 볼 수 있다.

당시 필자는 맵 사용이 익숙하지 않아 끝에는 결국 정답을 봐버린 게 안 비밀 읍읍

자세한 설명은 아래에 작성해 놓았으니, 혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면, 아래의 설명과 코드를 참고해 보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) 문자열을 인덱스로 갖는 맵 dogam1, 숫자를 인덱스로 갖는 벡터 dogam2를 전역 변수로 선언한다.

연이어, 입력으로 주어지는 문제에 대한 정답들을 저장할 벡터 dap도 전역 변수로 선언한다.

(숫자도 문자열 형태로 저장할 수 있기 때문에, dap은 string형으로 선언해 두었다.)

 

2) 도감의 개수(n)와 문제의 개수(t)를 입력받는다.

 

3) 도감을 입력받는 과정이다. n의 크기만큼, 반복문을 수행하여 아래의 연산을 취한다.

- 도감에 등록할 포켓몬 이름(name)을 입력받는다.

- dogam1에는 인덱스를 name으로 가지며 값을 번호로 갖는 쌍을 순차적으로 추가하도록 한다.

뒤이어, dogam2에는 단순 name의 값만 순차적으로 추가하도록 한다.

 

4) 각 문제에 답을 구하는 과정이다. t의 크기만큼, 반복문을 수행하여 아래의 연산을 취한다.

- 문제(test)를 입력받는다.

(이때, 숫자와 문자열 모두 원활히 입력받을 수 있도록 string형으로 받는다.)

- test의 값이 숫자인지 문자열인지 판별하고, 그에 따른 답을 구하도록 한다.

- 만일 test의 첫 번째 값 아스키코드가 숫자의 아스키코드를 갖는다면, 이는 도감 번호가 문제로 주어진 것이다.
따라서 이 경우엔, 숫자를 인덱스로 갖는 dogam2의 값을 알맞게 추출하도록 한다.
(이때, test의 타입이 문자열이기 때문에, stoi() 함수를 통해 숫자로 변환한 뒤 이용하도록 한다.)
- 만일 위 if문에서 걸러지지 않았다면, 이는 도감 이름이 문제로 주어진 것이다.
따라서 이 경우엔, 문자열을 인덱스로 갖는 dogam1의 값을 알맞게 추출하도록 한다.
(이때, dogam1의 값은 숫자이고 dap은 문자열 형태의 값을 갖기 때문에, to_string() 함수를 통해 값을 형변환하여 저장하도록 한다.)

 

5) 모든 답을 저장하였다면, dap에 저장된 값을 순차적으로 출력한 뒤 실행 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <string>
#include <vector>
#include <map>
#define endl '\n'
using namespace std;

//백준 1620번 코드
map<string, int> dogam1;	// 이름으로 도감번호를
vector<string> dogam2;	// 도감번호로 이름을
vector<string> dap;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);	cout.tie(NULL);

	int n, t;
	cin >> n >> t;
	for (int i = 0; i < n; i++) {
		string name;
		cin >> name;
		dogam1.insert({ name, i + 1 });
		dogam2.push_back(name);
	}
	for (int i = 0; i < t; i++) {
		string test;
		cin >> test;
		if (test[0] >= 48 && test[0] <= 57) {	// 도감번호일때
			dap.push_back(dogam2[stoi(test) - 1]);
		}
		else {	// 이름일때
			dap.push_back(to_string(dogam1[test]));
		}
	}
	
	for (int i = 0; i < dap.size(); i++) {
		cout << dap[i] << endl;
	}
}

 

제출 결과

백준 BOJ 1620번 나는야 포켓몬 마스터 이다솜 문제 C++ 제출 결과

(2022.12.09 백준 1620번 문제 제출 결과)

반응형