안녕하세요! 테크지니어22입니다.
오늘은 백준 알고리즘 1620번 - 나는야 포켓몬 마스터 이다솜 문제를 풀어보도록 하겠습니다.
https://www.acmicpc.net/problem/1620
[문제 접근]
- 이름에 대응되는 숫자를, 숫자에 대응되는 이름을 출력하는 문제입니다.
- n과 m이 10만이하이고, 시간제한이 2초이기 때문에 시간복잡도 O(N)이나 O(NlogN)이 통과할 거 같습니다.
[풀이 전략]
- 해시맵 두 개를 이용하여 풀었습니다.
- 문자열이 숫자인지 아닌지 판별하는 함수를 작성했습니다.
[코드]
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <cctype>
using namespace std;
bool isNumber(string str) {
for(auto c: str) {
if(!isdigit(c)) return false;
}
return true;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n, m ;
cin >> n >> m ;
unordered_map<int,string> m1 ;
unordered_map<string,int> m2 ;
for(int i = 0 ; i < n ; i++){
string name ;
cin >> name ;
m1[i+1] = name ;
m2[name] = i+1 ;
}
for(int i = 0 ; i < m ; i++) {
string quiz ;
cin >> quiz;
if(isNumber(quiz)) {
cout << m1[stoi(quiz)] << '\n';
} else {
cout << m2[quiz] << '\n';
}
}
}
[개선점]
- 해시맵보다 배열이 더 빠르기 때문에 숫자에 대응되는 이름을 저장하는 자료구조는 배열로 교체하는 게 더 좋습니다.
- 문자열이 숫자인지 판별하는 함수를 작성했는데, 이번 문제에서는 문자열 첫번째인덱스만 숫자인지 아닌지만 판별해도 답을 구할 수 있습니다.
'알고리즘 > 백준' 카테고리의 다른 글
[백준/C++] 알고리즘 1715번 - 카드 정렬하기 (0) | 2024.09.29 |
---|---|
[백준/C++] 알고리즘 1806번 - 부분 합 (0) | 2024.09.28 |
[백준/C++] 알고리즘 7785번 - 회사에 있는 사람 (5) | 2024.09.28 |
[백준/C++] 알고리즘 22862번 - 가장 긴 짝수 연속한 부분 수열 (1) | 2024.05.15 |
[알고리즘/C++] 에라토스테네스의 체 (0) | 2024.05.13 |