본문 바로가기

알고리즘 풀이/프로그래머스

[프로그래머스] 방금그곡 / 2018 KAKAO BLIND RECRUITMENT(3차) - JAVA

🔗 문제 링크

[프로그래머스] 방금그곡 / 2018 KAKAO BLIND RECRUITMENT(3차)

 

코딩테스트 연습 - [3차] 방금그곡

방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,

programmers.co.kr

 

📝 풀이 과정

주어진 멜로디를 포함하는 악보를 가진 음악을 구하는 문제이다.
문제에서 중요한 점은 CC#은 다르기 때문에 #이 붙어있는 음을 바꿔주어야 문자열을 찾게 될 때 오류가 없어지게 된다.

 

주어진 문자열에서 변환음을 모두 바꾸어 반환해주는 changeStr(str) 함수를 만들어 사용하였다. 

 

 

음악은 재생된 시간만큼 멜로디가 구성되는데, 만약 음악이 플레이시간보다 짧다면 재생시간만큼 멜로디가 잘리게 되고, 길다면 그만큼 반복이 이루어진다는 것이다.

재생 시간 :  8분
악보 : ABC
재생된 멜로디 : ABCABCAB

 

 

따라서 주어진 재생 시간 / 악보의 길이만큼 멜로디가 반복되어 재생되고, 재생 시간 % 악보의 길이만큼 악보가 잘라져 덧붙여지게 되는 것이다. Java에서 문자열을 반복하기 위해 반복문을 돌려 붙일 수도 있지만 new String(new char[n]).replace("\0", str)을 사용하면 문자열 str을 n만큼 반복시킨 문자열이 생성되어 이를 사용해주었다.

String play = new String(new char[playTime / sheet.length()]).replace("\0", sheet);
play += sheet.substring(0, playTime % sheet.length());

 

 

재생 멜로디를 구하기 위해 재생시간을 구해야 하는데 주어진 문자열에서 HH:mm의 형태로 시작 시간과 종료 시간이 주어진다. 이를 DateTimeFormatter를 사용해 포맷을 지정해주고 LocalTime.parse(String, DateTimeFormatter)를 사용해 파싱해주었다. 또한 시간의 차를 구하기 위해 Duration.between을 사용해 시간의 간격을 반환해 toMinutes()를 통해 분으로 받아주었다.

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");

//info[0] : 시작시간, info[1] : 종료 시간
int playTime = (int) Duration.between(LocalTime.parse(infos[0], dtf), LocalTime.parse(infos[1], dtf)).toMinutes();

 

💻 코드

import java.time.Duration;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

class Solution {
    public String solution(String m, String[] musicinfos) {
    	m = changeStr(m);
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");

        int ansLen = 0;
        String ans = "(None)";
        for (String musicinfo : musicinfos) {
            String[] infos = musicinfo.split(",");
            int playTime = (int) Duration.between(LocalTime.parse(infos[0], dtf), LocalTime.parse(infos[1], dtf)).toMinutes();

            String sheet = changeStr(infos[3]);
            String play = new String(new char[playTime / sheet.length()]).replace("\0", sheet);
            play += sheet.substring(0, playTime % sheet.length());

            if (play.contains(m) && ansLen < playTime) {
                ansLen = playTime;
                ans = infos[2];
            }
        }

        return ans;
    }

    public String changeStr(String str) {
        return str.replace("A#", "a")
                .replace("C#", "c")
                .replace("D#", "d")
                .replace("F#", "f")
                .replace("G#", "g");
    }
}