https://www.acmicpc.net/problem/1620
처음에는 HashMap을 한개 만들어서 <포켓몬 번호, 포켓몬 이름>을 저장했다.
문제가 번호로 주어지면 map.get(key)로 이름을 불러오면 됐지만,
문제가 이름으로 주어지면 어떻게 해야할지 고민하다가 entrySet을 사용했다.
for(int i = 0; i < m; i++) { String str = br.readLine(); if(str.matches("^[0-9]*$")) { sb.append(map.get(Integer.parseInt(str)) + "\n"); } else { for(Map.Entry<Integer, String> entry : map.entrySet()) { Integer key = entry.getKey(); String value = entry.getValue(); if(str.equals(value)) { sb.append(key + "\n"); } } } }
하지만 이렇게 되면 2중 for문을 사용해서 시간 초과가 나왔다.
그래서 찾은 방법은 HashMap을 2개를 둬서 하나는 <번호, 이름>으로 저장하고 하나는 <이름, 번호>로 저장하는 것이다.
이렇게 되면 문제가 번호로 주어져도, 이름으로 주어져도 상관없이 map.get()으로 답을 얻을 수 있다.
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());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
HashMap<Integer, String> map1 = new HashMap<>();
HashMap<String, Integer> map2 = new HashMap<>();
for(int i = 0; i < n; i++) {
String name = br.readLine();
map1.put(i+1, name);
map2.put(name, i+1);
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < m; i++) {
String prob = br.readLine();
if(prob.matches("^[0-9]*$")) {
sb.append(map1.get(Integer.parseInt(prob)) + "\n");
} else {
sb.append(map2.get(prob) + "\n");
}
}
System.out.println(sb.toString());
}
}