방금그곡
라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV, 라디오 등에서 나온 음악에 관해 제목 등의 정보를 제공하는 서비스이다.
네오는 자신이 기억한 멜로디를 가지고 방금그곡을 이용해 음악을 찾는다. 그런데 라디오 방송에서는 한 음악을 반복해서 재생할 때도 있어서 네오가 기억하고 있는 멜로디는 음악 끝부분과 처음 부분이 이어서 재생된 멜로디일 수도 있다. 반대로, 한 음악을 중간에 끊을 경우 원본 음악에는 네오가 기억한 멜로디가 들어있다 해도 그 곡이 네오가 들은 곡이 아닐 수도 있다. 그렇기 때문에 네오는 기억한 멜로디를 재생 시간과 제공된 악보를 직접 보면서 비교하려고 한다. 다음과 같은 가정을 할 때 네오가 찾으려는 음악의 제목을 구하여라.
입력으로 네오가 기억한 멜로디를 담은 문자열 m과 방송된 곡의 정보를 담고 있는 배열 musicinfos가 주어진다.
function solution(m, musicinfos) {
let result = [];
// #이 있으면 앞에 있는 글자는 소문자로 바꿔주는 함수
function mChange (arr) {
let res = "";
for(let i=0; i<arr.length; i++){
if(arr[i+1] === "#"){
res += arr[i].toLowerCase();
i++
}else{
res += arr[i].toUpperCase();
}
}
return res;
}
m = mChange(m)
// 끝나는시간에서 시작시간을 뺀 값을 구하는 함수
function getTime (start,end) {
let [startHour, startMinute] = start.split(":").map(Number);
let [endHour, endMinute] = end.split(":").map(Number);
let st = startHour*60 + startMinute;
let ed = endHour*60 + endMinute;
// 시작 시간이 더 크면 24시간 더해줌 ex(23:47,0:05);
if(st > ed){
ed += 24 * 60
}
return ed - st;
}
for(let i=0; i<musicinfos.length; i++){
let [start,end,dic,play] = musicinfos[i].split(",")
// 재생시간
let playTime = getTime(start,end);
play = mChange(play)
let totalPlay = ""
// 시간만큼 더해줌
for(let i=0; i<playTime; i++){
totalPlay += play[i%play.length]
}
// totalPlay에 m이 포함되면 시간이랑 단어를 푸쉬
if(totalPlay.includes(m)){
result.push([playTime, dic])
}
}
// 정렬
result.sort((a,b) => {
if(a[0] === b[0]){
return a[1].localeCompare(b[1])
}else{
return b[0] - a[0]
}
})
// 결과가 없으면 (None)
let answer = result.length > 0 ? result[0][1] : "(None)"
return answer
}
C, C#, D, D#, E, F, F#, G, G#, A, A#, B 이렇게 있으니깐
"#" 이 있는건 앞에 있는 string을 소문자로 바꿔서 푸는 방식으로 했다.
총 재생시간을 가져와서 악보에 추가해주고 그 악보가 m에 포함이 되어있으면 결과에 넣어준다음에 정렬해서 첫번째 값을 반환.