프로그래머스 방금그곡 (Java,자바)

jonghyukLee·2022년 10월 5일
0

이번에 풀어본 문제는
프로그래머스 방금그곡 입니다.

📕 문제 링크

❗️코드

import java.util.PriorityQueue;
import java.util.Queue;

class Music {
    int time;
    String title;

    public Music(int time, String title) {
        this.time = time;
        this.title = title;
    }
}
class Solution {
    public String solution(String m, String[] musicinfos) {
        String inputMusic = convertMusic(m);

        Queue<Music> pq = new PriorityQueue<>((o1,o2) -> o2.time - o1.time);
        for (String music : musicinfos) {
            String [] arr = music.split(",");
            //time
            int originTime = getTimeFromString(arr[0], arr[1]);
            int time = originTime;
            String title = arr[2];
            String convertedOriginMusic = convertMusic(arr[3]);
            int originMusicLen = convertedOriginMusic.length();
            String targetMusic = convertedOriginMusic;
            // 더 짧게 들은경우
            if (time < originMusicLen) {
                targetMusic = convertedOriginMusic.substring(0, time);
            }
            // 크거나 같음
            else {
                time -= originMusicLen;
                while (time > originMusicLen) {
                    targetMusic += convertedOriginMusic;
                    time -= originMusicLen;
                }
                targetMusic += convertedOriginMusic.substring(0, time);
            }
            // 일치하는 문자열이 존재한다면
            if (targetMusic.length() > targetMusic.replace(inputMusic,"").length()) {
                pq.add(new Music(originTime, title));
            }
        }
        return pq.isEmpty() ? "(None)" : pq.poll().title;
    }
    static int getTimeFromString(String start, String end) {
        String [] startTime = start.split(":");
        String [] endTime = end.split(":");

        int hour = (Integer.parseInt(endTime[0]) - Integer.parseInt(startTime[0])) * 60;
        int min = Integer.parseInt(endTime[1]) - Integer.parseInt(startTime[1]);

        return hour + min;
    }
    static String convertMusic(String music) {
        String result = music;
        result = result.replace("A#","a");
        result = result.replace("C#","c");
        result = result.replace("D#","d");
        result = result.replace("F#","f");
        result = result.replace("G#","g");
        return result;
    }
}

📝 풀이

주어진 입력으로 일치하는 문자열(악보)를 찾는 문제입니다.
들은 시간이 기존 악보보다 길경우, 해당 시간만큼 악보를 이어붙여 주고 입력값과 비교해주면 해결할 수 있습니다.
A#, C#, D# 등의 값들은 길이는 2이지만 한 음당 1분 듣는다는 조건이 존재하고, 해당 값들을 문자열로 체크하려면 A, C, D와 겹치지 않도록 문자열을 변경해야합니다. 저는 소문자 알파벳을 택했지만, 어떤 문자로 변경하던지 큰 상관은 없습니다.

📜 후기

생각보다 까다로운 문제였습니다. 그래도 재밌는 문제네요!

profile
머무르지 않기!

0개의 댓글