문제
네오는 자신이 기억한 멜로디를 가지고 방금그곡을 이용해 음악을 찾는다. 그런데 라디오 방송에서는 한 음악을 반복해서 재생할 떄도 있어서 네오가 기억하고 있는 멜로디는 음악 끝부분과 처음 부분이 이어서 재생된 멜로디일수도 있다. 반대로, 한 음악을 중간에 끊을 경우 원본 음악에는 네오가 기억한 멜로디가 들어있다 해도 그 곡이 네오가 들은 곡이 아닐 수도 있다. 그렇기 때문에 네오는 기억한 멜로디를 재생 시간과 제공된 악보를 직접 보면서 비교하려고 한다. 다음과 같은 가정을 할 때 네오가 찾으려는 음악의 제목을 구하여라.
- 방금그곡 서비스에서는 음악 제목, 재생이 시작되고 끝난 시각, 악보를 제공한다.
- 네오가 기억한 멜로디와 악보에 사용되는 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12개이다.
- 각 음은 1분에 1개씩 재생된다. 음악은 반드시 처음부터 재생되며 음악 길이보다 재생된 시간이 길 떄는 음악이 끊김 없이 처음부터 반복해서 재생된다. 음악 길이 보다 재생된 시간이 짧을 때는 처음부터 재생 시간만큼만 재생된다.
- 음악이 00:00를 넘겨서까지 재생되는 일은 없다.
- 조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.
- 조건이 일치하는 음악이 없을 때에는 "'(None)'"을 반환한다.
입력형식
입력으로 네오가 기억한 멜로디를 담은 문자열 m과 방송된 곡의 정보를 담고 있는 배열 musicinfos 가 주어진다.
- m은 음 1개 이상 1439개 이하로 구성되어 있다.
- musicinfos는 100개 이하의 곡 정보를 담고 있는 배열로, 각각의 곡 정보는 음악이 시작한 시각, 끝난 시각, 음악 제목, 악보 정보가 ','로 구분된 문자열이다.
- 음악의 시작 시각과 끝난 시각은 24시간 HH:MM 형식이다.
- 음악 제목은 ',' 이외의 출력 가능한 문자로 표현된 길이 1 이상 64이하의 문자열이다.
- 악보 정보는 음 1개 이상 1439개 이하로 구성되어 있다.
입출력 예시
설명
첫 번쨰 예시에서 HELLO는 길이가 7분이지만 12:00부터 12:14까지 재생되었으므로 실제로 CDEFGABCDEFGAB로 재생되었고, 이 중에 기억한 멜로디인 ABCDEFG가 들어있다.
세 번째 예시에서 HELLO는 C#DEFGABC#DEFGAB로, WORLD로 ABCDE로 재생되었다. HELLO 안에 있는 ABC#은 기억한 멜로디인 ABC와 일치하지 않고, WORLD 안에 있는 ABC가 기억한 멜로디와 일치한다.
풀이
chage 메서드를 통해 C#, D#, F#, G#, A#을 c, d, f, g, a 로 변경해준다. '#'이 있기에 구분하기 때문에 소문자로 변경해준다. (네오가 기억한 멜로디를 담은 문자열 m)
방송된 곡의 정보를 담고 있는 배열 musicinfos를 ',' 로 나누고, arr[3] 악보정보이기 때문에 chage 메서드를 통해 #을 소문자로 변경해 준다.
startTime과 endTime을 통해 음악이 재생된 분을 구한다.
악보정보와 방송한 시간을 통해 전체 악보를 구하는 메서드이다.
만약 조건이 일치하면 라디오에서 재생된 시간이 제일 긴 음악의 제목을 반환하라고 하였기에 songlen과 min 변수를 비교 하였습니다.
전체코드
class Solution {
public String solution(String m, String[] musicinfos) {
String chagem = "", answer = "(None)";
int songlen = 0;
m = chage(m);
for(String divinfo : musicinfos) {
String[] arr = divinfo.split(",");
arr[3] = chage(arr[3]);
String[] startTime = arr[0].split(":");
String[] endTime = arr[1].split(":");
int hour = Integer.parseInt(endTime[0]) - Integer.parseInt(startTime[0]);
int min = Integer.parseInt(endTime[1]) - Integer.parseInt(startTime[1]) + (hour*60);
String fullsong = fullsong(arr[3], min);
if (fullsong.contains(m)) {
if(songlen < min) {
songlen = min;
answer = arr[2];
}
}
}
return answer;
}
private static String fullsong(String song, int min) {
String fullsong = "";
for(int j = 0; j < min; j++) {
fullsong += song.charAt(j % song.length());
}
return fullsong;
}
private static String chage(String tempM) {
tempM = tempM.replaceAll("C#", "c");
tempM = tempM.replaceAll("D#", "d");
tempM = tempM.replaceAll("F#", "f");
tempM = tempM.replaceAll("G#", "g");
tempM = tempM.replaceAll("A#", "a");
return tempM;
}
}
'algorithm' 카테고리의 다른 글
백준_수 정렬하기 3(10989) (0) | 2021.06.27 |
---|---|
[프로그래머스][1차][뉴스 클러스터링] (0) | 2020.04.18 |
[프로그래머스]영어 끝말잇기 (0) | 2020.04.11 |
[프로그래머스][1차]캐시 (0) | 2020.04.04 |
[프로그래머스]소수 만들기 - 재귀함수 (0) | 2020.03.22 |