문제 이름 : [3차] 방금그곡
<<< 문제 내용 >>>
function solution(m, mi) {
let answer =[];
// 샵들 소문자로 변경해서 1칸만 차지하게끔 변경
const toReplace = (value) => {
return value.replace(/C#/g,'c')
.replace(/D#/g,'d')
.replace(/F#/g,'f')
.replace(/G#/g,'g')
.replace(/A#/g,'a');
}
// 12:04 같은 것을 분으로 바꾸기
const timeToSecond = (time) => {
time = time.split(':').map(Number);
return time[0]*60+time[1];
}
// 분으로 바꾼 시간 빼서 재생된 시간 구하는 함수
const divideTime = (time1, time2) => {
return timeToSecond(time1)-timeToSecond(time2);
}
// 먼저 m부터 바꿔주고
m = toReplace(m);
// musicInfo에 [음악제목, 재생시간, 악보정보]를 넣어준다.
// 이때 악보정보가 재생된 시간보다 짧으면
// 악보정보를 repeat으로 반복해서 늘려주고
// slice로 재생된 시간만큼 잘라주었다.
const musicInfo = [];
mi.map((el)=> {
el = el.split(",");
const time = divideTime(el[1], el[0]);
el[3] = toReplace(el[3]);
const musicLen = el[3].length;
if(time>musicLen){
const temp = Math.floor(time/musicLen)+1;
el[3] = el[3].repeat(temp);
}
el[3] = el[3].slice(0, time);
musicInfo.push([el[2], time, el[3]]);
})
// 이 부분부터 하드코딩이 시작되었는데
// answer에 [음악제목, 재생시간]을 넣어주고
// max에는 각 재생시간을 다 넣어서 max숫자를 구하기위함이다.
// 어쨋든, m이 악보에 있는지 확인해서 있다면 넣어준다.
const max = [];
musicInfo.map((el)=> {
if(el[2].includes(m)) {
answer.push([el[0], el[1]]);
max.push(el[1]);
}
})
// 재생시간이 제일 큰 값을 구해주고,
// check으로 재생시간이 같은게 있을 때 맨 앞 수만 찾기위해
// check를 썼다. 근데 아래 answer.map에서 map을 멈출때
// break, return이 다 안먹히던데 어떻게 해야할지 아직 찾지 못했다.
const maxNum = Math.max(...max);
let check = true;
// 0개 1개 2개이상 일 때를 각각 처리했다.
if(answer.length===0) answer = "(None)";
else if(answer.length===1) answer = answer[0][0];
else if(answer.length>=2){
answer.map((el)=> {
if(el[1] === maxNum && check) {
answer = el[0];
check = false;
}
})
}
return answer;
}
도움이 되셨다면 공감 부탁드립니다.