알고리즘
[백준] 문제 31562번 : 전주 듣고 노래 맞히기 - JAVA
DoosanBaek
2024. 11. 29. 15:15
[링크] : https://www.acmicpc.net/problem/31562
💎 문제 분석 & 제약 조건
문제 분석 :
정환이 맞히기를 시도할 각 노래에 대하여 프로그램에 저장된 노래와 첫 세 음이 동일한 노래가 하나만 있다면 해당 노래의 제목을, 두 개 이상이면 ?을, 없다면 !을 한 줄에 하나씩 출력
제약 조건 :
1<= N <= 1000
1<= M <= 1000
1<= T <= 30
입력으로 주어지는 모든 수는 정수이다.
🚀 의사 결정
1. BufferedReader 로 입력받는다.
2. HashMap<String, String>을 사용하여 첫 3개 음을 key로, 해당 음에 맞는 노래 제목을 value로 저장
3. 만약 동일한 첫 3개 음이 여러 노래와 일치하면, 그 음에 대해 "MULTIPLE"로 표기하여 후속 검색에서
다수의 노래가 일치하는 경우를 처리
4. 각 음에 대해 먼저 HashMap에서 해당 음이 존재하는지 확인
5. 존재한다면?
하나의 노래만 해당 음과 일치하면 노래 제목을 출력
두 개 이상의 노래가 해당 음과 일치하면 "?"를 출력
해당 음이 없으면 "!"를 출력
6. BufferedWriter를 사용하여 결과를 출력, 한 번에 출력하는 방식으로 성능을 최적화
📜 소스코드(Java)
import java.io.*;
import java.util.HashMap;
public class Main {
public static void main(String[] args) throws IOException {
// 입력과 출력을 효율적으로 처리하기 위해 BufferedReader와 BufferedWriter 사용
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 첫 번째 줄에서 N(저장된 노래 수)과 M(입력 받을 음의 수) 읽기
String[] firstLine = br.readLine().split(" ");
int N = Integer.parseInt(firstLine[0]); // 저장된 노래의 수
int M = Integer.parseInt(firstLine[1]); // 맞힐 음의 수
// 3개 음을 key로, 해당 음이 가진 노래 제목 리스트를 value로 갖는 HashMap 생성
// 음이 여러 개일 수 있으므로, 중복된 음이 들어올 경우 "MULTIPLE"로 처리
HashMap<String, String> songMap = new HashMap<>();
// N개의 노래 정보 입력 받기
for (int i = 0; i < N; i++) {
// 노래 제목과 3개의 음 정보 받기
String[] songInfo = br.readLine().split(" ");
String songName = songInfo[1]; // 노래 제목
String note = songInfo[2] + songInfo[3] + songInfo[4]; // 첫 3개 음 (음은 3개만 필요)
// 음이 이미 저장되어 있을 경우, "MULTIPLE"로 설정하여 여러 개의 노래가 일치함을 표시
if (songMap.containsKey(note)) {
songMap.put(note, "MULTIPLE"); // 동일한 음이 여러 노래에 매칭됨
} else {
songMap.put(note, songName); // 첫 번째 등장하는 음은 노래 제목으로 저장
}
}
// M개의 음을 처리
for (int i = 0; i < M; i++) {
// 첫 3개 음을 입력받고 공백 제거 (음은 연속된 문자열로 처리)
String note = br.readLine().replace(" ", "");
// 해당 음이 songMap에 존재하는지 확인
if (!songMap.containsKey(note)) {
// 음에 맞는 노래가 없는 경우 "!" 출력
bw.write("!\n");
} else {
// 해당 음에 대해 저장된 값이 "MULTIPLE"이면 여러 개의 노래가 일치한 것이므로 "?" 출력
String result = songMap.get(note);
if (result.equals("MULTIPLE")) {
bw.write("?\n");
} else {
// 정확히 하나의 노래가 일치하면 그 노래 제목을 출력
bw.write(result + "\n");
}
}
}
// 최종 결과 출력
bw.flush(); // 버퍼에 저장된 모든 데이터를 출력
br.close();
bw.close();
}
}