- C#, D#, F#, G#, A#과 같은 뒤에 #이 붙은 문자를 예외처리 하기위해, C#을 소문자c로 D#을 소문자d로,,, 이렇게 기존의 문자와 구분되는 문자로 치환해준다.
- new Date()객체를 이용하여 재생된 시간을 구하고, 그 구간에 나왔던 멜로디의 전체를 구한다.
- string.includes 메서드를 이용하여, 일치하는 문자열을 찾고, 문제조건에 주어진 두 가지 음악이 곂치는 경우 재생시간이 긴 음악의 제목을 뽑기위해, 제목과 재생시간을 함께 stack에 넣어준다.
- len === 1 이면 스택에 존재하는 음악이 답, len === 0이면, 존재하는 음악이 없으므로, "(None)"을 리턴, len >=2이상이면, 재생시간을 기준으로 sort한 다음 맨 첫번째것을 답으로 리턴하면 된다.
function solution(m, musicinfos) {
var answer = '';
let stack = [];
m = m.replaceAll('C#','c').replaceAll('D#','d').replaceAll('F#','f').replaceAll('G#','g').replaceAll("A#",'a');
for(var jj =0; jj<musicinfos.length; jj++){
let value = musicinfos[jj].split(',');
let index =0;
let startTime = new Date(`2000-01-02 ${value[0]}:00`)
let finishTime = new Date(`2000-01-02 ${value[1]}:00`);
let title = value[2];
let melody = value[3].replaceAll('C#','c').replaceAll('D#','d').replaceAll('F#','f').replaceAll('G#','g').replaceAll("A#",'a');
let melodyLen = melody.length;
let wholeMelody = "";
let minute = (finishTime-startTime) / (60* 1000)
let min = minute
while(minute !== 0){
if(index < melodyLen){
wholeMelody+=melody[index];
index++
minute--;
}else{
index =0;
}
}
let key = m;
if(wholeMelody.includes(m)){
stack.push([title, min])
}
}
if(stack.length === 1){
return answer = stack[0][0]
}else if(stack.length > 1){
stack.sort((a,b)=>a[1] > b[1] ? 1 : -1)
return answer = stack.pop()[0]
}else{
return answer ='(None)'
}
}
어떻게 #이 붙은 문자를 처리하여야 할까 엄청 고민했었다. 30분정도 고민하다가, replaceAll을 이용하여, 다른문자와 구분되는 한글자 문자로 치환하면 된다고 생각이 나서 풀었다. 최대한 쉽게 풀 수 있도록 생각하는 버릇을 길러야겠다.