[프로그래머스] 17683. 방금그곡

2 분 소요

문제 링크

[프로그래머스] 17683. 방금그곡


풀이 과정

주어진 악보재생 시간 만큼 이어 붙여 네오가 기억하고 있는 멜로디(m) 가 해당 악보에 속해있는 지 파악하는 문제입니다.

문제에는 다음과 같이 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 의 총 12개의 음이 사용됩니다. 샵(#)을 포함하는 멜로디가 존재할 시, 하나의 음을 두 개의 문자로 표현하기 때문에, 문자열을 순회하면서 불필요한 인덱스 검사와 올바르지 않은 인덱스 참조로 인해 런타임 에러가 발생할 수 있습니다.


public static String convert(String melody) {
    melody = melody.replaceAll("A#", "a");
    melody = melody.replaceAll("C#", "c");
    melody = melody.replaceAll("D#", "d");
    melody = melody.replaceAll("F#", "f");
    melody = melody.replaceAll("G#", "g");

    return melody;
}

convert 메소드는 이를 예방하기 위한 함수입니다. 다음과 같이 샵이 붙은 다섯 개의 음 A#, C#, D#, F#, G# 을 각각 a, c, d, f, g 로 사전에 치환하여, 불필요한 인덱스 검사와 올바르지 않은 인덱스 참조로 인한 에러를 발생시키지 않도록 했습니다.


int playTime = Integer.parseInt(end[1]) - Integer.parseInt(start[1]);
if (!start[0].equals(end[0])) {
    int hour_diff = Integer.parseInt(end[0]) - Integer.parseInt(start[0]);
    playTime += 60 * hour_diff;
}

음악 재생 시간(HH:MM)은 종료 시각의 minutes 에서 시작 시간의 minutes 를 빼주었고, hours 에 해당하는 부분이 같지 않으면, hours 차이를 구해 miniutes 로 환산해 더해줬습니다.


public static String makeMelody(String akbo, int playTime) {
    String melody = "";
    int cnt = 0;
    int idx = 0;

    while (cnt < playTime) {
        if (idx + 1 < akbo.length() && akbo.charAt(idx + 1) == '#') {
            melody += akbo.substring(idx, idx + 2);
            idx += 2;
        } else {
            melody += akbo.charAt(idx);
            idx += 1;
        }

        idx = idx % akbo.length();
        cnt++;
    }

    return melody;
}

멜로디는 악보와 재생 시간을 이용해, 재생 시간만큼 악보의 각 음을 붙여 만듭니다. 악보의 각 음이 샵을 포함하는 지 확인하고, 인덱스를 조정해줬습니다.


코드

public class Main {
    public static String solution(String m, String[] musicinfos) {
        m = convert(m);

        String answer = "(None)";
        int max = 0;

        for (int i = 0; i < musicinfos.length; i++) {
            String s = musicinfos[i];

            String[] info = s.split(",");

            String[] start = info[0].split(":");
            String[] end = info[1].split(":");
            String name = info[2];
            String akbo = info[3];

            int playTime = Integer.parseInt(end[1]) - Integer.parseInt(start[1]);
            if (!start[0].equals(end[0])) {
                int hour_diff = Integer.parseInt(end[0]) - Integer.parseInt(start[0]);
                playTime += 60 * hour_diff;
            }

            String melody = makeMelody(akbo, playTime);
            melody = convert(melody);

            if (melody.contains(m)) {
                if (max < playTime) {
                    max = playTime;
                    answer = name;
                }
            }
        }

        return answer;
    }

    public static String convert(String melody) {
        melody = melody.replaceAll("A#", "a");
        melody = melody.replaceAll("C#", "c");
        melody = melody.replaceAll("D#", "d");
        melody = melody.replaceAll("F#", "f");
        melody = melody.replaceAll("G#", "g");

        return melody;
    }

    public static String makeMelody(String akbo, int playTime) {
        String melody = "";
        int cnt = 0;
        int idx = 0;

        while (cnt < playTime) {
            if (idx + 1 < akbo.length() && akbo.charAt(idx + 1) == '#') {
                melody += akbo.substring(idx, idx + 2);
                idx += 2;
            } else {
                melody += akbo.charAt(idx);
                idx += 1;
            }

            idx = idx % akbo.length();
            cnt++;
        }

        return melody;
    }

    public static void main(String[] args) {
        String m = "ABCDEFG";
        String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};

//        String m = "CC#BCC#BCC#BCC#B";
//        String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};

//        String m = "ABC";
//        String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};

//        String m = "CCB";
//        String[] musicinfos = {"03:00,03:10,FOO,CCB#CCB", "04:00,04:08,BAR,ABC"};

        solution(m, musicinfos);
    }
}

카테고리:

업데이트:

댓글남기기