99클럽 코테 스터디 7일차 TIL
💙 JAVA 비기너
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.HashMap;
public class Main {
public static void main(String[] args) throws IOException {
HashMap<String, String[]> songMap = new HashMap<>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] count = (br.readLine().split(" "));
for (int i=0; i<Integer.parseInt(count[0]); i++) {
String[] arr = br.readLine().split(" ");
songMap.put(arr[1], Arrays.copyOfRange(arr, 2, 5));
}
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (int j=0; j<Integer.parseInt(count[1]); j++) {
int same = 0;
String songName = "";
String[] sound = (br.readLine().split(" "));
for(String song : songMap.keySet()) {
if(Arrays.equals(sound, songMap.get(song))) {
same++;
songName = song;
}
}
if(same == 1) {
bw.write(songName);
} else if(same > 1) {
bw.write("?");
} else {
bw.write("!");
}
bw.write("\n");
}
br.close();
bw.flush();
bw.close();
}
}
오늘의 핵심은 해시에서 값으로 키값을 찾는 것 같다.
먼저 노래의 개수와 문제 수를 String 배열로 받아온 후 각각의 for문에서 Integer.parseInt()
를 통해 정수로 형변환을 시켜 사용했다.
String[] count = (br.readLine().split(" "));
for (int i=0; i<Integer.parseInt(count[0]); i++) {
// 노래의 정보를 해시에 저장
for (int j=0; j<Integer.parseInt(count[1]); j++) {
// 문제에 대한 음을 해시와 비교
노래의 정보는 공백을 기준으로 나누어 String 배열로 저장한 다음
해시 songMap
에 노래의 정보와 노래의 음정을 저장한다.
이 때 음정은 사실상 3개밖에 안필요하므로 Arrays.copyOfRange()
를 통해 3개의 음정만 저장해줬다.
arr[0]
은 제목의 글자수, arr[1]
은 노래의 제목이므로 2번째 인덱스부터 3번째 음이 저장되어있는 5번째 인덱스까지만 분리한 배열을 넣어줬다.
String[] arr = br.readLine().split(" ");
songMap.put(arr[1], Arrays.copyOfRange(arr, 2, 5));
노래의 정보를 저장할 때와 마찬가지로 문제의 음도 String 배열로 받고 songMap
의 키값만 foreach문으로 받아 songMap
에 하나씩 넣어 값을 비교했다.
same
이라는 변수에 문제의 음정과 노래의 음정이 같은 수를 넣어주고 songName
에 음정이 같은 노래의 제목을 저장해주었다.
int same = 0;
String songName = "";
String[] sound = (br.readLine().split(" "));
for(String song : songMap.keySet()) {
if(Arrays.equals(sound, songMap.get(song))) {
same++;
songName = song;
}
}
마지막으로 same
이 1이라면 음이 같은 노래가 하나이므로 노래의 제목을, 1 초과라면 중복된 노래가 있다는 것이므로 "?"를, 그 외(0)에는 "!"를 노출하게 했다.
bw.write(songName);
} else if(same > 1) {
bw.write("?");
} else {
bw.write("!");
}
bw.write("\n");