#해시 #HashMap #StringToKenizer
백준 브론즈1) 전주 듣고 노래 맞히기
노래에 대한 첫 세 음과 노래 문제의 세 음을 비교하여 출력해야되는 문제라 HashMap을 사용하여 해당되는 value에 대한 key값을 출력하면 되겠다고 생각했다.
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));
Map<String, String> map = new HashMap<>();
// song[0] : 음을 아는 노래의 개수 , song[1] : 노래 문제 개수
String[] song = br.readLine().split(" ");
// 음을 아는 노래 저장
for(int i=0; i<Integer.parseInt(song[0]); i++) {
// s[0] : 노래 문자열 개수 , s[1] : 노래 제목 , s[2]~ : 노래의 음이름
String[] s = br.readLine().split(" ");
map.put(s[1], s[2]+s[3]+s[4]);
}
// 노래 문제 출제
for(int i=0; i<Integer.parseInt(song[1]); i++) {
String s = br.readLine().replace(" ","");
// 문제 맞추기
int cnt = 0;
String name = "";
for(Map.Entry<String, String> m : map.entrySet()) {
if(s.equals(m.getValue())) {
if (name.equals("")) {
name = m.getKey();
}
cnt++;
}
}
// 결과 출력
if(cnt == 0) {
System.out.println("!");
} else if (cnt == 1) {
System.out.println(name);
} else {
System.out.println("?");
}
}
br.close();
}
}
코딩테스트 문제를 풀 때 많은 사람들이 StringTokenizer를 사용한다. 왜일까?
key를 세 음으로 지정함으로써 노래 문제를 출제하기 전에 알고 있는 노래 목록에서 첫 세 음이 같은 것이 있는지 확인할 수 있다.
[기존방법] 20684KB 316ms
[다른방법] 18184KB 192ms
// 다른 방법 1,2 구현
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));
Map<String, String> map = new HashMap<>();
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()); // 알고있는 노래 개수
int m = Integer.parseInt(st.nextToken()); // 문제 풀제 개수
// 음을 아는 노래 저장
for (int i=0; i<n; i++) {
st = new StringTokenizer(br.readLine());
st.nextToken(); // 노래 제목 문자열 개수
String title = st.nextToken(); // 노래 제목
StringBuilder sb = new StringBuilder();
for(int j=0; j<3; j++) {
sb.append(st.nextToken());
}
String melody = sb.toString(); // 노래 첫 세 음
if (map.containsKey(melody)) {
// 같은 음이 두 개 이상이라는 의미 => "?" 저장
map.put(melody, "?");
} else {
map.put(melody, title);
}
}
// 노래 문제 출제
for (int i=0; i<m; i++) {
String s = br.readLine().replace(" ","");
// 문제 맞추기
if (map.containsKey(s)) {
System.out.println(map.get(s));
} else {
System.out.println("!");
}
}
br.close();
}
}