1 분 소요



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



📌 문제

문제 유형

  • 해시맵


문제 설명

  • 1번부터 N번까지 포켓몬이 순서대로 입력된다
  • 총 M개의 질문이 주어지며, 각 질문은 포켓몬의 이름 또는 번호이다.
    • 이름이 입력되면 해당 포켓몬의 번호를 출력
    • 번호가 입력되면 해당 번호의 포켓몬 이름을 출력


입출력 예시

입력

3 3
Pikachu
Charmander
Squirtle
Pikachu
2
Squirtle

출력

1
Charmander
3



🔍 문제 풀이

① 포켓몬 이름과 번호를 동시에 저장한다

→ 양방향 매핑을 통해 이름 → 번호, 번호 → 이름 을 가능하게 하는 것

  • 이름 → 번호: HashMap<String, Integer>
  • 번호 → 이름: HashMap<Integer, String>


② 입력을 받으면서 두 맵에 모두 저장한다

nameToNum.put(name, i);
numToName.put(i, name);


③ 질문을 읽고, 숫자인지 문자인지 판별한다

  • 숫자면: Integer.parseInt(query) → 이름 출력
  • 문자열이면: 이름 → 번호 조회



💭 놓친 점

처음에는 HashMap 하나만 사용해서 해결하려고 했지만, HashMap은 단방향 매핑(key → value)만 지원한다는 사실을 몰랐다.


아래와 같을 때,

Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);

“apple”이라는 key로 1이라는 value를 찾을 수는 있지만,
1이라는 value로 “apple”을 바로 찾을 수는 없다는 것을 몰랐던 것이다.

key → value 방향만 지원하고, value → key는 직접 구현해야 한다.


해결방안

양방향 조회를 하기 위해 HashMap 두 개를 따로 만들어 해결하였다.



💻 전체 코드

package org.example;

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

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

        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        Map<String, Integer> nameToNum = new HashMap<>();
        Map<Integer, String> numToName = new HashMap<>();

        for (int i = 1; i <= n; i++) {
            String name = br.readLine();
            nameToNum.put(name, i);
            numToName.put(i, name);
        }

        for (int i = 0; i < m; i++) {
            String query = br.readLine();
            if (Character.isDigit(query.charAt(0))) {
                // 숫자로 들어온 경우
                int num = Integer.parseInt(query);
                sb.append(numToName.get(num)).append("\n");
            } else {
                // 이름으로 들어온 경우
                sb.append(nameToNum.get(query)).append("\n");
            }
        }

        System.out.print(sb);
    }
}

카테고리:

업데이트:

댓글남기기