728x90
꽤나 재미있는 구현 문제였다.
우선 시간차이를 구해주는 함수와 a배열안에 b배열이 있는지 판단하는 함수를만들어주었다.
a배열에 안에 b배열이 있다는건
[1,2,3,4,5] 안에 [1,2,3] 이들어왔을때 1,2,3이 연속으로 들어있으면 참을 반환해주는 함수이다.
즉, [1,2,5] 가 들어온다면 거짓을 반환한다.
musicinfos를 split함수로 시작시간,끝시간,곡이름,악보로 분리해준 후, 문제에서 일치하는 노래가 많으면 재생시간이 긴 순서가 우선순위라 해주었으므로 정렬을 해준다.
이후 정규표현식을 활용해서 각 악보의 음계들을 배열로 분리해준다.
이제 해당 멜로디가 얼마나 나올지 구해줘야 하는데, getTimeDiff함수로 시간 차이를 구해준 이후, 몫과 나머지를 구해서 총 재생되는 최종 악보를 만들어준다.
이제 최종악보에서 내가 구하고자 하는 멜로디가 있는지 확인해서 있으면 바로 반환하고 없다면 (NONE) 이란 문자열을 반환해주면 된다.
function solution(m, musicinfos) {
//시간 차이를 분으로 반환
const getTimeDiff = (s,e) => {
const [sH,sM] = s.split(':').map(v => +v)
const [eH,eM] = e.split(':').map(v => +v)
return eH*60 + eM - sH*60 - sM
}
// a배열안에 b배열이 포함되어있는지 확인
const isIncludeAry = (a,b) => {
outer : for (let i = 0 ;i < a.length ; i++) {
if (a[i] !== b[0]) continue
for (let j = 0 ; j < b.length ; j++) {
if (i+j >= a.length || a[i+j]!==b[j]) continue outer
}
return true
}
return false
}
//musicinfo를 보기좋게 변환
musicinfos = musicinfos.map(v => v.split(',')).sort((a,b) => {
return getTimeDiff(b[0],b[1]) - getTimeDiff(a[0],a[1])
})
const sheetMusics = musicinfos.map(([start,end,name,music]) => {
//재생되는 악보를 구함
const sheet = music.match(/C#|D#|F#|G#|A#|C|D|E|F|G|A|B/g)
const diff = getTimeDiff(start,end)
const [div,mod] = [~~(diff/sheet.length) , diff%sheet.length]
return music.repeat(div) + sheet.slice(0,mod).join("")
})
for (let i = 0 ; i < sheetMusics.length ; i++) {
const sheetMusic = sheetMusics[i].match(/C#|D#|F#|G#|A#|C|D|E|F|G|A|B/g)
const mAry = m.match(/C#|D#|F#|G#|A#|C|D|E|F|G|A|B/g)
if (mAry && sheetMusic && isIncludeAry(sheetMusic,mAry))
return musicinfos[i][2]
}
return "(None)"
}
728x90
'FrontEnd > 프로그래머스' 카테고리의 다른 글
[JS] 뉴스 클러스터링 (0) | 2023.07.14 |
---|---|
[JS] 캐시 (0) | 2023.07.14 |
[JS] 압축 (0) | 2023.07.13 |
[JS] 파일명 정렬 (0) | 2023.07.13 |
[JS] N진수 게임 (0) | 2023.07.11 |