1620번: 나는야 포켓몬 마스터 이다솜
https://www.acmicpc.net/problem/1620
# 코드
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// 빠른 입력을 위한 BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// 도감에 수록되는 포켓몬 개수 N, 문제의 개수 M
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
long n = Long.parseLong(st.nextToken());
long m = Long.parseLong(st.nextToken());
// 도감으로 사용할 Map
// 시간초과 방지를 위해 두 가지 버전으로 만들어준다.
Map<Long, String> book_Long = new HashMap<>();
Map<String, Long> book_String = new HashMap<>();
// 도감(book)에 수록하기
for (long i = 1; i <= n; i++) {
String line = br.readLine();
book_Long.put(i, line);
book_String.put(line, i);
}
// 문제 맞추기
for (long j = 0; j < m; j++) {
String input = br.readLine();
if (49 <= input.charAt(0) && input.charAt(0) <= 57) {
// 번호를 물어본 경우 (이름[=Value]을 대답)
sb.append(book_Long.get(Long.parseLong(input))).append("\n");
} else {
// 이름을 물어본 경우 (번호[=Key]를 대답)
sb.append(book_String.get(input)).append("\n");
}
}
// StringBuilder에 쌓은 문자열 출력
System.out.println(sb);
// Reader 버퍼 닫기
br.close();
}
}
- 도감은 Map 을 이용해 <Key, Value> 형식으로 포켓몬 번호와 이름을 저장한다.
- 포켓몬 이름을 물어본 경우 처음에는 Value로 Key를 찾는 메소드를 작성해 호출했으나, 전체 keySet을 다 뒤지며 일치하는 Key값을 찾아와야 했기때문에 시간초과 판정을 받았다.
- 따라서 시간초과 방지를 위해 <번호, 이름> 과 <이름, 번호> 두 가지 버전으로 도감을 만들어준다.
- 번호(Long)를 물어보는지, 이름(String)을 물어보는지를 판단하기 위해 String.charAt(0) 으로 문자열의 첫 인덱스 값을 확인한다.
- charAt()은 문자의 아스키코드 값을 반환하는데, 숫자 1~9 의 아스키코드 값은 49~57 이다. 따라서 문자열의 첫 인덱스 값이 이 범위 내에 있다면 번호(Long)로 판단하고 이름을 대답한다.
'코딩테스트 > 자바 문제풀이' 카테고리의 다른 글
[자료구조2] 백준 4358 생태학 (4) | 2024.07.22 |
---|---|
[자료구조2] 백준 14425 문자열 집합 (2) | 2024.07.21 |
[자료구조] 백준 1874 스택 수열 (0) | 2024.07.19 |
[자료구조] 백준 1966 프린터 큐 (0) | 2024.07.18 |
[자료구조] 백준 1935 후위 표기식(2) (0) | 2024.07.17 |