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

yseo14·2025년 1월 11일

코딩테스트 대비

목록 보기
40/88


문제링크

문제가 굉장히 길지만 위에 부분은 굳이 읽지 않아도 된다.

풀이1

해시맵은 key를 통해 value를 찾을 때 시간복잡도가 O(1)이지만 containValue() 메서드를 사용할 경우 내부적으로 반복문을 통해 찾기 때문에 시간초과가 발생한다.
따라서 해시맵에 포켓몬의 번호와 이름을 저장하는데, <번호, 이름>, <이름, 번호> 로 순서가 다른 두 해시맵에 저장해야한다.

그리고 문제가 번호일 경우, 이름일 경우로 나뉘어지는데
번호인지 판단하기 위해 문제로 입력되는 값의 첫글자가 1~9 사이인지 아스키코드로 확인한다.
문자열 1~9는 아스키코드로 49~57에 해당한다.

코드1

package BOJ;

import java.io.*;
import java.util.*;

public class sol1620 {
    static int n, m;

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

        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());

        HashMap<Integer, String> numName = new HashMap<>();
        HashMap<String, Integer> nameNum = new HashMap<>();
        for (int i = 1; i <= n; i++) {
            String name = br.readLine();
            numName.put(i, name);
            nameNum.put(name, i);
        }

        for (int i = 0; i < m; i++) {
            String q = br.readLine();
            if (q.charAt(0) >= 49 && q.charAt(0) <= 57) {
                int num = Integer.parseInt(q);
                sb.append(numName.get(num)).append("\n");
            } else {
                sb.append(nameNum.get(q)).append("\n");
            }
        }
        System.out.println(sb);

    }
}

풀이2

문제가 번호인지 이름인지 확인하기 위해 아스키코드가 아닌try-catch를 사용하는 방법도 있다.
입력된 문제(string)을 Integer.parseInt()로 정수형을 변환한다. 변환 가능하다면 변환 후 <번호, 이름> 구성의 해시맵에서 찾으면 되고, 변환이 불가능하다면 NumberFormatException이 발생하기 때문에 catch문에서 <name, number> 해시맵에서 찾으면 된다.

코드2

package BOJ;

import java.io.*;
import java.util.*;

public class sol1620_2 {
    static int n, m;

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

        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());

        HashMap<Integer, String> numName = new HashMap<>();
        HashMap<String, Integer> nameNum = new HashMap<>();
        for (int i = 1; i <= n; i++) {
            String name = br.readLine();
            numName.put(i, name);
            nameNum.put(name, i);
        }

        for (int i = 0; i < m; i++) {
            String q = br.readLine();
            try {
                int num = Integer.parseInt(q);
                sb.append(numName.get(num)).append("\n");
            } catch (NumberFormatException e) {
                sb.append(nameNum.get(q)).append("\n");
            }
        }
        System.out.println(sb);

    }
}
profile
like the water flowing

0개의 댓글