728x90
https://www.acmicpc.net/problem/1620
1620번: 나는야 포켓몬 마스터 이다솜
첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면
www.acmicpc.net
이 문제는 약간 생각을 깊게하면 더러운 문제인 것 같다.
단순하게 배열여러개 쓰면 쉽게 풀 수 있지만 처음에 EntrySet이나 Iterator를 이용해서 할려고 하다보니 쓸데없이 시간을 좀 많이 썼다가 그냥 단순하게 풀기로 했다.
이 문제를 풀면서 HashMap에 왜 getKey메서드가 없는건지 아쉬웠다...
어쨌든 EntrySet이나 Iterator를 쓰기에는 너무 코드가 더러워지고 시간초과가 나서 그냥 단순하게 HashMap을 두개로 만들어서 해결했다.
package backjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class b1620 {
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> map = new HashMap<>();
HashMap<String, Integer> map1 = new HashMap<>();
for(int i=0; i<N; i++){
String tmp = br.readLine();
int tm = i+1;
map.put(tm,tmp);
map1.put(tmp,tm);
}
StringBuilder sb = new StringBuilder();
for(int i=0; i<M; i++){
String tmp = br.readLine();
try{
if(map.containsKey(Integer.parseInt(tmp))){
sb.append(map.get(Integer.parseInt(tmp))+"\n");
}
}catch (Exception e){
if (map1.containsKey(tmp)) {
sb.append(map1.get(tmp)+"\n");
}
}
}
System.out.println(sb);
}
}
위 코드를 보면 일단 N,M값을 받아와서 HashMap을 두개를 만든다 하나는 포켓몬 이름을 key로 한 것과 다른 하나는 포켓몬 번호를 key로 한 것이다. 이렇게 해서 Map을 구성하고 그 다음은 입력 받은 값으로 검색을 하는 것이다.
여기서 입력 값이 String인지 Int인지 알기 위해서 parseInt메서드를 사용했고 여기서 던지는 예외를 처리하여 int로 받아오지 못하는 것은 String으로 간주하여 포켓몬 이름의 값으로 포켓몬 번호를 찾는 과정을 수행하게끔 만들었다. 다른 사람들은 배열과 Map을 사용하기도 한것 같았다.
728x90