백준 1620번 나는야 포켓몬 마스터 이다솜: 이름과 번호로 조회하기
조회 방향에 맞춰 두 곳에 저장합니다
이름이 들어오면 도감 번호를, 번호가 들어오면 이름을 출력해야 합니다. 이름을 키로 찾는 HashMap과 입력 순서대로 이름을 담은 ArrayList를 함께 사용했습니다.
코드에는 0부터 시작하는 인덱스를 저장합니다. 그래서 이름으로 찾은 인덱스를 출력할 때는 1을 더하고 입력받은 도감 번호로 리스트를 읽을 때는 1을 뺍니다.
숫자가 아닌 문자가 있는지 확인합니다
checkStr()는 입력의 문자를 하나씩 살펴봅니다. Character.isDigit()는 문자열 전체를 보지 않고 문자 하나가 숫자인지만 확인합니다. 숫자가 아닌 문자가 하나라도 있으면 true를 반환해 이름으로 조회합니다. 끝까지 모두 숫자라면 그때는 false를 반환하고 번호로 찾습니다. 코드의 “문자열이면 false / 정수면 true” 주석은 실제 반환값과 반대로 적혀 있습니다.
문제에서 주어지는 입력은 포켓몬 이름 또는 도감 번호입니다. 이 구분은 그 둘을 처리하려고 만든 것이라서 부호가 붙은 수처럼 일반적인 모든 정수 표기를 판별하는 함수는 아닙니다.
당시 제출 코드
import java.io.*;
import java.util.*;
class Main {
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
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());
HashMap<String, Integer> hmap = new HashMap<>();
ArrayList<String> arr = new ArrayList<>();
for (int i = 0; i < N; i++) {
String name = br.readLine();
hmap.put(name, i);
arr.add(name);
}
for (int i = 0; i < M; i++) {
String input = br.readLine();
if (checkStr(input)) {
sb.append(hmap.get(input)+1).append("\n");
} else {
sb.append(arr.get(Integer.parseInt(input) - 1)).append("\n");
}
}
bw.write(sb.toString());
bw.flush();
}
// 문자열이 정수인지 문자열인지 판단하는 메소드, 문자열이면 false / 정수면 true
static boolean checkStr(String str) {
for (int i = 0; i < str.length(); i++) {
if (!Character.isDigit(str.charAt(i))) {
return true;
}
}
return false;
}
}