[Baekjoon] 1620번: 나는야 포켓몬 마스터 이다솜

2023. 3. 7. 19:58Computer Sciences/Problem Solve

https://www.acmicpc.net/problem/1620

문제 설명

문제가 엄청나게 길지만 요약하면 다솜이가 사용할 포켓몬 도감을 만들어줘야 한다.

N개만큼 포켓몬 이름이 입력되며 순서가 있고 순서대로 저장된다. 그 다음 입력되는 질문 M개에 대해서 대답해야 한다.

숫자로 들어오는 경우 해당 번호에 해당되는 포켓몬 이름이 출력되고 포켓몬 이름이 들어오면 해당 번호가 출력돼야 한다.

풀이 방법

2개의 HashMap을 이용해 해결했다.

한 개는 번호를 키로 사용하고 값을 포켓몬 이름을 저장하고, 다른 하나는 키로 포켓몬 이름을 사용하고 값으로 번호를 저장한다.

그 다음엔 질문이 숫자인지 포켓몬 이름인지 판별해야 하는데 이 방법으론 두 가지가 있다.

  1. matches()를 활용한 정규식
  2. 첫 글자만 가져와서 판별하기

정규식으로 해결한 코드는 다음과 같다.

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