FrontEnd/프로그래머스

[JS] 방금 그곡

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