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";
}
}