[99클럽 코테 스터디 7일차 TIL] 백준 31562 전주 듣고 노래 맞히기

말하는 감자·2024년 11월 3일
0
post-thumbnail

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");
profile
나는 말하는 감자다

0개의 댓글