코딩테스트

[프로그래머스/javascript] [3차] 방금 그곡

_서리__ 2023. 4. 30. 15:37
function solution(m, musicinfos) {
    let musicArr = musicinfos.map((el)=>el.split(','))
    //musicinfos를 조건 별로 나눠준다.
    let musicScale  = [];
    //music의 음을 재생된 시간에 맞춰서 넣어줄 배열이다.
    let answer =[];
    for(let i=0;i<musicinfos.length;i++){
        musicScale.push([musicArr[i][2]])
        //일단 music의 이름을 넣어준다.
        let hours = Number(musicinfos[i].slice(6,8))-Number(musicinfos[i].slice(0,2))
        let minutes = Number(musicinfos[i].slice(9,11))-Number(musicinfos[i].slice(3,5))
        let time = hours*60+minutes
        musicScale[i].push(time)
        // 재생 시간을 계산하여 넣어준다,
        let musics = musicArr[i][3].split('')
        for(let j=0;j<musics.length;j++){
            if(musics[j]==='#'){
                musics[j-1] = musics[j-1].toLowerCase();
            }
        }
        musics = musics.filter((el)=>(el!=='#'))
            //#이 붙은 음의 경우는 소문자로 바꿔주고, #은 없애준다.
        if(time<=musics.length){
            musicScale[i].push(musics.slice(0,time).join(''))
            // 재생 시간이 음의 길이보다 짧은 경우는 그만큼 잘라서 넣어주고
        }else{
            let repeatedNum = Math.floor(time/musics.length)
            let rest = time%musics.length
            let newMusics = musics.join('').repeat(repeatedNum)
            newMusics+=musics.slice(0,rest).join('')
            musicScale[i].push(newMusics)
            // 긴 경우는 그만큼 반복해서 넣어준다.
        }
    }
    m=m.split('')
    for(let i=0;i<m.length;i++){
        if(m[i]==='#'){
            m[i-1] = m[i-1].toLowerCase()
            }
    }
    m = m.filter((el)=>(el!=='#')).join('')
    //m도 #이 붙어있는 것은 소문자로 바꾸는 작업을 해준다.
    let max = 0;
    for(let i=0;i<musicScale.length;i++){
        if(musicScale[i][2].includes(m)){
            max = Math.max(musicScale[i][1],max)
            answer.push(musicScale[i])
        }
        //answer에 m을 포함하는 애들만 골라서 넣어주고, answer가 2개 이상인 경우를 대비하여 max도 구해준다.
    }
    if(answer.length===0) return "(None)" //answer가 없다면 none을 반환한다.
    if(answer.length===1) return answer[0][0] //1개라면 이름을 그대로 반환한다.
    else{
        answer = answer.filter((el)=>el[1]===max)
        return answer[0][0] // 여러개가 있다면 max와 같은 애들만 찾아서, 그중의 첫번째 값을 반환한다.
    }
}