[Baekjoon] 1620번: 나는야 포켓몬 마스터 이다솜
2023. 3. 7. 19:58ㆍComputer Sciences/Problem Solve
https://www.acmicpc.net/problem/1620
문제 설명
문제가 엄청나게 길지만 요약하면 다솜이가 사용할 포켓몬 도감을 만들어줘야 한다.
N개만큼 포켓몬 이름이 입력되며 순서가 있고 순서대로 저장된다. 그 다음 입력되는 질문 M개에 대해서 대답해야 한다.
숫자로 들어오는 경우 해당 번호에 해당되는 포켓몬 이름이 출력되고 포켓몬 이름이 들어오면 해당 번호가 출력돼야 한다.
풀이 방법
2개의 HashMap을 이용해 해결했다.
한 개는 번호를 키로 사용하고 값을 포켓몬 이름을 저장하고, 다른 하나는 키로 포켓몬 이름을 사용하고 값으로 번호를 저장한다.
그 다음엔 질문이 숫자인지 포켓몬 이름인지 판별해야 하는데 이 방법으론 두 가지가 있다.
- matches()를 활용한 정규식
- 첫 글자만 가져와서 판별하기
정규식으로 해결한 코드는 다음과 같다.
if (question.matches("-?\\d+")) {
sb.append(numberMap.get(Integer.parseInt(question)));
} else {
sb.append(namedMap.get(question));
}
첫 글자만 가져와서 판별하는 방법은 다음과 같다.
char first = question.charAt(0);
if (first >= '0' && first <= '9') {
sb.append(numberMap.get(Integer.parseInt(question)));
} else {
sb.append(namedMap.get(question));
}
정규식은 성능이 좋지는 않기 때문에 필요한 경우가 아니라면 웬만하면 쓰지 말자.
실제로 시간 차이도 꽤 많이 발생한다.
전체 코드는 다음과 같다.
Java
package baekjoon.array;
import java.io.*;
import java.util.*;
public class BOJ1620 {
public static void main(String[] args) throws IOException {
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
String[] split = br.readLine().split(" ");
int N = Integer.parseInt(split[0]);
int M = Integer.parseInt(split[1]);
Map<String, Integer> namedMap = new HashMap<String, Integer>();
Map<Integer, String> numberMap = new HashMap<Integer, String>();
for (int i = 1; i <= N; i++) {
String pocketmonName = br.readLine();
namedMap.put(pocketmonName, i);
numberMap.put(i, pocketmonName);
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < M; i++) {
String question = br.readLine();
char first = question.charAt(0);
if (first >= '0' && first <= '9') {
sb.append(numberMap.get(Integer.parseInt(question)));
} else {
sb.append(namedMap.get(question));
}
sb.append("\n");
}
sb.delete(sb.length() - 1, sb.length());
System.out.println(sb);
}
}
}
C++
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int n, m;
unordered_map<string, int> named_map;
unordered_map<int, string> number_map;
int main()
{
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(0);
cin >> n >> m;
string pocketmon;
for (int i = 1; i <= n; i++)
{
cin >> pocketmon;
named_map.insert(make_pair(pocketmon, i));
number_map.insert(make_pair(i, pocketmon));
}
string question;
for (int i = 0; i < m; i++)
{
cin >> question;
if (question[0] >= '0' && question[0] <= '9')
cout << number_map.find(stoi(question))->second;
else
cout << named_map.find(question)->second;
cout << "\n";
}
return 0;
}
'Computer Sciences > Problem Solve' 카테고리의 다른 글
[Baekjoon] 1926번: 그림 (0) | 2023.03.09 |
---|---|
[Baekjoon] 1269번: 대칭 차집합 (0) | 2023.03.08 |
[Baekjoon] 16236번: 아기 상어 - Java (0) | 2023.03.06 |
[Baekjoon] 14425번: 문자열 집합 - Java (0) | 2023.03.04 |
[Baekjoon] 16953번: A -> B - Java (0) | 2023.03.03 |