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

jw·2022년 2월 7일
0

백준

목록 보기
9/141
post-thumbnail

문제 설명

https://www.acmicpc.net/problem/1620
1. N개 줄에 걸쳐서 포켓몬의 이름이 입력된다.
2. M개 줄에 걸쳐서 입력이 들어오는데 숫자면 그 숫자에 해당하는 포켓몬 이름을 출력하고, 입력이 문자(포켓몬 이름)면 그 포켓몬의 숫자를 출력한다.

아이디어

처음에는 무려 삼중for문으로 코드를 짰는데 역시나 시간 초과가 떴다.🌝

이 문제는 map을 이용해서 풀어야한다!
그리고.. map의 효과는 굉장했다.

우선 맵은 딕셔너리같은 개념이었다. map<string,int> 이면 key로 string타입의 변수가 들어오고 value로 int 타입의 변수가 저장되는 것이다.

먼저 두 개의 map을 선언해줬다.
map<string, int>p;
map<int, string> p2;

처음에 for문으로 N개의 string s 입력을 받을 때 p[s]=i, p1[i]=s
로 각각 포켓몬 정보를 저장해준다.

	for (int i = 1; i <= n; i++) {
		cin >> s;
		p[s] = i;
		p2[i] = s;
	}

그 다음으로 m개 줄에 걸쳐 출력을 하기 위해
입력을 받고 해당 입력이 문자인지 숫자인지 판별해야한다.
나는 stoi(string to int)를 주구장창 시도했는데 문자가 들어왔을 때 계속해서 오류가 났다.
그 대신 사용한 방법으로 atoi(s.c_str())은 잘 작동했다.
만약 atoi(s.c_str())==0 이라면 해당 입력은 문자열로 판단되어 p[s]를 출력하고
입력이 숫자라면 문자열을 int형식으로 바꿔서 p2[atoi(s.c_str())]을 출력한다.

	for (int i = 0; i < m; i++) {
		cin >> s;
		if (atoi(s.c_str()) == 0) {//문자면
			cout << p[s] << "\n";
		}
		else//숫자면
			cout << p2[atoi(s.c_str())] << "\n";
	}

🚨 ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
얘를 안썼더니 시간초과가 났다..
잊지 말자!


전체 코드

#include <iostream>
#include <algorithm>
#include<string>
#include <string.h>
#include <map>

using namespace std;
int n, m;
string s,x;
map<string, int>p;
map<int, string> p2;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
    
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> s;
		p[s] = i;
		p2[i] = s;
	}
	for (int i = 0; i < m; i++) {
		cin >> s;
		if (atoi(s.c_str()) == 0) {//문자면
			cout << p[s] << "\n";
		}
		else//숫자면
			cout << p2[atoi(s.c_str())] << "\n";
	}
}
profile
다시태어나고싶어요

0개의 댓글

관련 채용 정보