알고리즘/백준
[백준 1620] 나는야 포켓몬 마스터 이다솜(Java)
이채림
2024. 11. 14. 21:32
나는야 포켓몬 마스터 이채림
🚨 문제 상황 1
Java에서 HashMap은 키-값 쌍으로 데이터를 저장하는 자료구조로
주로 키를 사용해 값을 검색하는데 최적화되어 있다.
위에 코드를 보면 값으로 키를 검색해야 하는 상황이 생긴 것을 확인핑.
🍧 해결법 1
entrySet() 사용을 사용하면 된다.
🍉 코드 1
import java.io.*;
import java.util.*;
public class Main {
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<>();
for(int i=1; i<=n; i++) {
String str = br.readLine();
map.put(i, str);
}
StringBuilder sb = new StringBuilder();
for(int i=0; i<m; i++) {
String answer = br.readLine();
if(isNumber(answer)) {
sb.append(map.get(Integer.parseInt(answer))).append("\n");
} else {
for(Map.Entry<Integer, String> entry : map.entrySet()) {
if(entry.getValue().equals(answer)) {
sb.append(entry.getKey()).append("\n");
break;
}
}
}
}
System.out.println(sb);
}
// 숫자인지 확인하는 메서드
private static boolean isNumber(String str) {
try {
Integer.parseInt(str);
return true;
} catch (NumberFormatException e) {
return false;
}
}
}
🚨 문제 상황 2
엥

🍧 해결법 2
시간 초과가 발생한 이유는 HashMap을 사용했음에도 값으로 키를 찾는 과정에서
for(Map.Entry<Integer, String> entry : map.entrySet()) 루프를 사용했기 때문이다.
이 루프는 HashMap의 모든 값을 순회하면서 값을 비교하므로
만약 입력 크기가 크다면 시간 초과가 발생할 가능성이 높다.
값으로 키를 빠르게 찾기 위해, HashMap을 두 개 사용하는 것이 가장 효율적이다.
하나는 번호 -> 이름 저장 (HashMap<Integer, String>)
다른 하나는 이름 -> 번호 저장(HashMap<String, Integer>)
🍉 최종 코드
import java.io.*;
import java.util.*;
public class Main {
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> mapNumToName = new HashMap<>();
// 이름 -> 번호 맵
HashMap<String, Integer> mapNameToNum = new HashMap<>();
for (int i = 1; i <= n; i++) {
String str = br.readLine();
mapNumToName.put(i, str);
mapNameToNum.put(str, i);
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < m; i++) {
String answer = br.readLine();
if (isNumber(answer)) {
// 숫자인 경우 번호로 이름 찾기
sb.append(mapNumToName.get(Integer.parseInt(answer))).append("\n");
} else {
// 이름으로 번호 찾기
sb.append(mapNameToNum.get(answer)).append("\n");
}
}
System.out.println(sb);
}
// 숫자인지 확인하는 메서드
private static boolean isNumber(String str) {
try {
Integer.parseInt(str);
return true;
} catch (NumberFormatException e) {
return false;
}
}
}
훠얼씬 보기 깔끔핑 해졌다 ㅎㅎ