상세 컨텐츠

본문 제목

31562. 전주 듣고 노래 맞히기

Algorithm

by aeongiii 2024. 11. 29. 14:30

본문



1. 문제 분석
    1) 정환이가 알고 있는 노래는 N개이다. 2번째 줄부터 N+1번째 줄까지 알고있는 노래의 글자수 T + 제목 + 음 7개가 주어진다.
    2) 정환이가 맞혀야 할 노래는 M개이다. N+2번째 줄부터 맞혀야 할 노래의 음 3개가 주어진다.
    3) 이미 알고있는 노래라면 "노래 제목"을 출력한다.
    4) 음이 동일한 노래가 두개 이상이라면 "?"를 출력한다.
    5) 음이 동일한 노래가 없다면 "!"를 출력한다.

2. 제약 조건
    1 <= N <= 1000
    1 <= M <= 1000
    1 <= T <= 30
    입력으로 주어지는 모든 수는 정수이다.

3. 의사결정
    1) N과 M을 입력받는다.
    2) N만큼 for문
        (1) 글자수 T + 노래제목 + 음 7개 받는다.
        (2) 음 7개 중 앞쪽 3개만 남긴다.
        (3) hashmap 만들고 음 3개를 key에, 노래제목을 value에 리스트로 넣는다.
    3) M만큼 for문
        (1) 음 3개 받는다. (중간 공백 포함)
        (2) hashmap.keyset 중에서 음 3개랑 같은게 있다면 모두 뽑아낸다.
        (3) 결과에 따라 노래 제목, ?, ! 중 적절한 것을 출력한다.


4. 문제 해결
    1) 기본 hashmap을 만들고 key에 음 3개를 넣었더니, key가 중복될 경우 value가 덮어씌워지는 문제가 있었다.
       hashmap을 <String, List<String>>으로 선언하여 value값에 제목이 여러 개 들어갈 수 있도록 변경했다.
       -> 이렇게 바꾸면 카운팅도 필요 없다!

import java.util.*;
import java.io.*;

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()); // N 받기
        int M = Integer.parseInt(st.nextToken()); // M 받기
        HashMap<String, List<String>> hashmap = new HashMap<>(); // 해시맵 선언 [음 3개 : 제목 리스트]

        // N개의 노래 저장
        for (int i = 0; i < N; i++) {
            String line = br.readLine(); // 한줄 받기
            String[] strArr = line.split(" ", 3);

            String title = strArr[1]; // 노래 제목
            String melody3 = strArr[2].substring(0,5); // "C C G G A A G" 중에서 "C C G"만 잘라서 저장

            if (!hashmap.containsKey(melody3)) hashmap.put(melody3, new ArrayList<>()); // 해당 리스트가 아직 없을 경우, [음 3개 : 리스트] 저장
            hashmap.get(melody3).add(title); // 리스트에 제목 추가
        }

        // M개의 문제 맞히기
        for (int j = 0; j < M; j++) {
            String line = br.readLine(); // 한줄 받기

            if (!hashmap.containsKey(line)) { // 일치하는 제목이 없을 경우 ! 출력
                System.out.println("!");
            } else {
                List<String> titleList = hashmap.get(line); // 해당 음에 대한 노래 제목 리스트 가져오기
                if (titleList.size() == 1) System.out.println(titleList.get(0)); // 1개뿐이라면 제목 출력
                else System.out.println("?"); // 2개 이상이라면 ? 출력
            }
        }

    }
}

 

'Algorithm' 카테고리의 다른 글

19638. 센티와 마법의 뿅망치  (4) 2024.11.29
15829. Hashing  (0) 2024.11.29
9933. 민균이의 비밀번호  (0) 2024.11.29
1769. 3의 배수  (1) 2024.11.28
10828. 스택  (0) 2024.11.28

관련글 더보기