1620번: 나는야 포켓몬 마스터 이다솜 (acmicpc.net)
1620번: 나는야 포켓몬 마스터 이다솜
첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면
www.acmicpc.net
다솜이가 포켓몬을 참 좋아하는갑다.
문제를 상당히 정성스럽게 만드셨다. 일단 문제를 보자마자 map을 만들어야겠다는 생각을했고
문제의 조건은 input값이 String일때 (포켓몬이름) 포켓몬 번호를 출력하고
input값이 Integer일때 (포켓몬 번호)일때 포켓몬 이름을 출력하라고 했다.
일반적으로 map을 사용할때, key > value를 얻는건 매우쉽다. 그냥
if(containsKey(key1) > get(key1) 해버리면 value를 쉽게 얻지만,
그 반대로 value에서 key를 끌어오는건 좀 더 복잡하다.
이 문제는 만약 내가 map(Integer, String)으로 설정하고 문제를 시작한다면 위에 말했던 반대로 끌어는 코드를 구현하는건 불가피하다.
따라서 맵을 두개 사용하는 생각을 해보면 문제가 매우 간단해진다.
Map<Integer,String> 한개, Map<String,Integer> 한개 설정해버리면 문제의 조건따라 포켓몬 이름이 들어오면 두번째 map을 써서 value바로 얻고, 그 반대면 첫번째 맵을 쓰면 끝.
이 아이디어만 알면 바로 코드로 구현할수 있겠다.
bufferdreader을 썼기에 try -catch 구문을 써서 numberformat 예외 처리를 해줬다. 문제에서 포켓몬 이름이 들어올 경우 parseInt()가 안되니까 !
package 백준;
import java.io.*;
import java.util.*;
public class _1620_포켓몬마스터_시간절약코드 {
public static void main(String[] args) throws IOException {
//이렇게하면 메소드를 안쓰고 가능 즉 map을 2가지 종류로 만들어버리기.
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> numToName = new HashMap<>();
HashMap<String, Integer> nameToNum = new HashMap<>();
for (int i = 1; i <= n; i++) {
String name = br.readLine();
numToName.put(i, name);
nameToNum.put(name, i);
}
for (int i = 0; i < m; i++) {
String question = br.readLine();
try {
int numQuestion = Integer.parseInt(question);
System.out.println(numToName.get(numQuestion));
} catch (NumberFormatException e) {
String nameQuestion = question;
System.out.println(nameToNum.get(nameQuestion));
}
}
}
}
'Algorithm_PS' 카테고리의 다른 글
백준 1764 <듣보잡> (1) | 2023.12.02 |
---|---|
백준 11478 <서로 다른 부분문자열의 개수> (0) | 2023.12.02 |
백준 18870 <좌표 압축> (1) | 2023.11.27 |
백준 11650, 11651 <좌표 정렬하기 1,2> (2) | 2023.11.27 |
백준 10989 <수 정렬하기 3> (1) | 2023.11.17 |