[Algorithm/Java] 백준 1620번 - 나는야 포켓몬 마스터
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);
}
}
댓글남기기