문제가 굉장히 길지만 위에 부분은 굳이 읽지 않아도 된다.
해시맵은 key를 통해 value를 찾을 때 시간복잡도가 O(1)이지만 containValue() 메서드를 사용할 경우 내부적으로 반복문을 통해 찾기 때문에 시간초과가 발생한다.
따라서 해시맵에 포켓몬의 번호와 이름을 저장하는데, <번호, 이름>, <이름, 번호> 로 순서가 다른 두 해시맵에 저장해야한다.
그리고 문제가 번호일 경우, 이름일 경우로 나뉘어지는데
번호인지 판단하기 위해 문제로 입력되는 값의 첫글자가 1~9 사이인지 아스키코드로 확인한다.
문자열 1~9는 아스키코드로 49~57에 해당한다.
package BOJ;
import java.io.*;
import java.util.*;
public class sol1620 {
static int n, m;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
HashMap<Integer, String> numName = new HashMap<>();
HashMap<String, Integer> nameNum = new HashMap<>();
for (int i = 1; i <= n; i++) {
String name = br.readLine();
numName.put(i, name);
nameNum.put(name, i);
}
for (int i = 0; i < m; i++) {
String q = br.readLine();
if (q.charAt(0) >= 49 && q.charAt(0) <= 57) {
int num = Integer.parseInt(q);
sb.append(numName.get(num)).append("\n");
} else {
sb.append(nameNum.get(q)).append("\n");
}
}
System.out.println(sb);
}
}
문제가 번호인지 이름인지 확인하기 위해 아스키코드가 아닌try-catch를 사용하는 방법도 있다.
입력된 문제(string)을 Integer.parseInt()로 정수형을 변환한다. 변환 가능하다면 변환 후 <번호, 이름> 구성의 해시맵에서 찾으면 되고, 변환이 불가능하다면 NumberFormatException이 발생하기 때문에 catch문에서 <name, number> 해시맵에서 찾으면 된다.
package BOJ;
import java.io.*;
import java.util.*;
public class sol1620_2 {
static int n, m;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
HashMap<Integer, String> numName = new HashMap<>();
HashMap<String, Integer> nameNum = new HashMap<>();
for (int i = 1; i <= n; i++) {
String name = br.readLine();
numName.put(i, name);
nameNum.put(name, i);
}
for (int i = 0; i < m; i++) {
String q = br.readLine();
try {
int num = Integer.parseInt(q);
sb.append(numName.get(num)).append("\n");
} catch (NumberFormatException e) {
sb.append(nameNum.get(q)).append("\n");
}
}
System.out.println(sb);
}
}