[백준] 1620번 - 나는야 포켓몬 마스터 이다솜 (Java)

Yong·2025년 1월 29일

백준

목록 보기
1/2

[백준] 1620번 문제


문제 풀이

  • 처음에는 아래 코드와 같이 배열을 이용하여 풀이를 해보았는데, 시간 초과가 발생하였다.
    그 이유는, 찾는 값이 글자라면 for문을 두번 돌게 되어 많은 시간을 사용했기 때문이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
		
        //포켓몬 도감
        String[] pocketmonName = new String[N];

        //포켓몬 도감 만들기
        for(int i=0; i<N; i++) pocketmonName[i] = br.readLine();

        //포켓몬 문제 풀기
        //숫자 -> 그에 해당하는 포켓몬 이름 출력, 글자 -> 그에 해당하는 포켓몬 숫자 출력
        for(int i=0; i<M; i++) {
            String input = br.readLine();
            char ch = input.charAt(0); //

            if(Character.isDigit(ch)) { //숫자라면
                int num = Integer.parseInt(input);
                sb.append(pocketmonName[num-1]).append("\n"); //포켓몬 이름 넣기
            }
            else{ //글자라면
                int count = 1;
                for(String str : pocketmonName) {
                    if(str.equals(input)) sb.append(count).append("\n");
                    count++;
                }
            }
        }
        br.close();
        
        //결과 출력
        System.out.println(sb);
    }
}
  • 그래서 고민해보면서 HashMap을 사용해야겠다고 생각하였고,
    HashMap을 하나만 두게 되면 배열 선언한 것과 똑같은 방법이기 때문에 다시 시간초과가 날 것이라고 생각하였다.

  • 그래서 HashMap을 두개 선언하여 '숫자'입력이 들어오면 문자를 찾아내는 Map 한개,
    '문자'입력이 들어오면 숫자를 찾아내는 Map 한개, 총 두 개의 Map을 선언하여 문제 풀이를 하였다.


정답 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        HashMap<Integer, String> NumToWord = new HashMap<>(); //숫자로부터 이름 알아내기
        HashMap<String, Integer> WordToNum = new HashMap<>(); //이름으로부터 숫자 알아내기

        //포켓몬 도감 만들기
        for(int i=1; i<=N; i++) {
            String pocketmonName = br.readLine();
            NumToWord.put(i, pocketmonName);
            WordToNum.put(pocketmonName, i);
        }

        //포켓몬 문제 풀기
        for(int i=0; i<M; i++) {
            String input = br.readLine();
            if(Character.isDigit(input.charAt(0))) { //숫자라면 -> 그에 해당하는 포켓몬 이름 출력
                int num = Integer.parseInt(input);
                sb.append(NumToWord.get(num)).append("\n"); //포켓몬 이름 넣기
            }
            else{ //글자라면 -> 그에 해당하는 포켓몬 숫자 출력
                sb.append(WordToNum.get(input)).append("\n");
            }
        }
        
        //결과 출력
        System.out.println(sb);
    }
}

profile
Coram Deo

0개의 댓글