코딩테스트/자바 문제풀이

[자료구조2] 백준 1620 나는야 포켓몬 마스터 이다솜

승요나라 2024. 7. 20. 18:14

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

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

 

# 코드

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        // 빠른 입력을 위한 BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        // 도감에 수록되는 포켓몬 개수 N, 문제의 개수 M
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        long n = Long.parseLong(st.nextToken());
        long m = Long.parseLong(st.nextToken());

        // 도감으로 사용할 Map
        // 시간초과 방지를 위해 두 가지 버전으로 만들어준다.
        Map<Long, String> book_Long = new HashMap<>();
        Map<String, Long> book_String = new HashMap<>();

        // 도감(book)에 수록하기
        for (long i = 1; i <= n; i++) {
            String line = br.readLine();
            book_Long.put(i, line);
            book_String.put(line, i);
        }

        // 문제 맞추기
        for (long j = 0; j < m; j++) {
            String input = br.readLine();

            if (49 <= input.charAt(0) && input.charAt(0) <= 57) {
                // 번호를 물어본 경우 (이름[=Value]을 대답)
                sb.append(book_Long.get(Long.parseLong(input))).append("\n");
            } else {
                // 이름을 물어본 경우 (번호[=Key]를 대답)
                sb.append(book_String.get(input)).append("\n");
            }
        }

        // StringBuilder에 쌓은 문자열 출력
        System.out.println(sb);

        // Reader 버퍼 닫기
        br.close();
    }
}
  • 도감은 Map 을 이용해 <Key, Value> 형식으로 포켓몬 번호와 이름을 저장한다.
  • 포켓몬 이름을 물어본 경우 처음에는 Value로 Key를 찾는 메소드를 작성해 호출했으나, 전체 keySet을 다 뒤지며 일치하는 Key값을 찾아와야 했기때문에 시간초과 판정을 받았다.
  • 따라서 시간초과 방지를 위해 <번호, 이름> 과 <이름, 번호> 두 가지 버전으로 도감을 만들어준다.
  • 번호(Long)를 물어보는지, 이름(String)을 물어보는지를 판단하기 위해 String.charAt(0) 으로 문자열의 첫 인덱스 값을 확인한다.
  • charAt()은 문자의 아스키코드 값을 반환하는데, 숫자 1~9 의 아스키코드 값은 49~57 이다. 따라서 문자열의 첫 인덱스 값이 이 범위 내에 있다면 번호(Long)로 판단하고 이름을 대답한다.