[c++] 백준 1620 : 나는야 포켓몬 마스터 이다솜
🥈실버 4
https://www.acmicpc.net/problem/1620
접근
이름으로 번호를 , 번호로 이름을 뽑아내야 한다.
각각의 경우에 해당하는 map을 두개 만들거나,
string -> int map과 string 배열을 활용하는 방법으로 구현할 수 있다.
입력값은 정수 또는 문자열이 될 수 있기에, c++에서는 string형으로 문자열을 받아 이것이 정수인지 문자열인지 판별하는 메서드를 활용하는 방법을 사용해야 했다.
주요 키워드
isdigit, stoi, stringstream
unordered_map
map을 두번 사용한 코드
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
unordered_map<string, int> m;
unordered_map<int, string> m2;
int N, M;
cin >> N >> M;
for (int i = 1; i <= N; i++){
string name;
cin >> name;
m[name] = i;
m2[i] = name;
}
while(M--) {
string input;
cin >> input;
stringstream ss(input);
int num;
if(ss >> num) {
cout << m2[stoi(input)] << '\n';
}
else cout << m[input] << '\n';
}
return 0;
}
stringstream 객체를 ss라는 이름으로 생성하고, ss >> num을 통해 입력받은 문자열로 부터 정수를 추출하여 num에 할당하려는 시도를 할 수 있다. 가능 여부를 true나 false로 반환하기 때문에 정수를 입력받았는지, 문자열을 입력 받았는지에 대한 처리가 가능하다.
true의 경우에는 num에 정수값이 담기기 때문에, m2[stoi(input)] 대신 m2[num]을 사용해도 무방하다.
map과 배열을 함께 사용한 코드
#include <bits/stdc++.h>
using namespace std;
string arr[100002];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
unordered_map<string, int> m;
int N, M;
cin >> N >> M;
for (int i = 1; i <= N; i++){
cin >> arr[i];
m[arr[i]] = i;
}
for (int i = 1; i <= M; i++) {
string val;
cin >> val;
if (isdigit(val[0])) {
cout << arr[stoi(val)] << '\n';
}
else cout << m[val] << '\n';
}
return 0;
}
isdigit는 인수로 들어오는 값이 문자형일 때 이것이 정수인지 그냥 문자인지를 판별하는 메서드이다.
입력값에는 25나 100같은 긴 정수가 올 수 있기 때문에 char 자료형으로 값을 받을 수가 없다.
string으로 값을 입력받는 대신, 가장 앞 자리 요소만 따면 char형으로 받아올 수 있기 때문에 isdigit 메서드를 활용할 수 있었다.
stoi는 string 자료형을 int로 반환하는 것이므로 isdigit가 true일 경우 입력받은 값을 정수로 반환하여 필요한 값을 가져올 수 있다.
'알고리즘 문제 풀이' 카테고리의 다른 글
[c++] 백준 2075 : N번째 큰 수 (0) | 2023.04.04 |
---|---|
[c++] 백준 11286 : 절댓값 힙 (0) | 2023.04.03 |
[c++] 백준 2504 : 괄호의 값 (0) | 2023.04.01 |
[c++] 백준 10799 : 쇠막대기 (0) | 2023.03.30 |
[파이썬] 백준 3020 : 개똥벌레 (0) | 2023.01.01 |