HANA -J

프로그래머스 - 방금 그곡 본문

개발/알고리즘

프로그래머스 - 방금 그곡

Hana-J 2021. 12. 26. 20:51

> 문제설명

첫 번째 예시에서 HELLO는 길이가 7분이지만 12:00부터 12:14까지 재생되었으므로 실제로 CDEFGABCDEFGAB로 재생되었고, 이 중에 기억한 멜로디인 ABCDEFG가 들어있다.
세 번째 예시에서 HELLO는 C#DEFGABC#DEFGAB로, WORLD는 ABCDE로 재생되었다. HELLO 안에 있는 ABC#은 기억한 멜로디인 ABC와 일치하지 않고, WORLD 안에 있는 ABC가 기억한 멜로디와 일치한다.

 

> 입출력 예시

"ABCDEFG" ["12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"] "HELLO"
"CC#BCC#BCC#BCC#B" ["03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"] "FOO"
"ABC" ["12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"] "WORLD"

> 코드 

function solution(m, musicinfos) {
    let answer =[];
    let arr =[];
    let answer1 ;
    let time=[];
    let c_music=[];
    let c_title=[];
    m = m.replace(/(C#)/g, 'c')      //# 이 붙어있는 입력값을 문자열 한개로 변경
             .replace(/(D#)/g, 'd')
             .replace(/(F#)/g, 'f')
             .replace(/(G#)/g, 'g')
             .replace(/(A#)/g, 'a') 
    //입력값을 map 으로 각각의 배열에 넣어주기
    const result = musicinfos.map((it, index)=>{
        const [start, end, title, music] = it.split(',');
        let h = Number(end.slice(0,2) - start.slice(0,2));
        let mi = Number(end.slice(3) - start.slice(3));
        let long = 60*h+mi;          //재생시간 구하기
        //console.log(long)
        time.push(long);
        c_music.push(music.replace(/(C#)/g, 'c')
             .replace(/(D#)/g, 'd')
             .replace(/(F#)/g, 'f')
             .replace(/(G#)/g, 'g')
             .replace(/(A#)/g, 'a'))
        c_title.push(title)
    }) 
    for(let i =0; i<c_title.length; i++){
       if(time[i]<c_music[i].length){     //재생시간이 음길이보다 짧을때 
           c_music[i] = c_music[i].slice(0, time[i]);
       }else{
           c_music[i] = c_music[i].repeat(time[i]/c_music[i].length)+ c_music[i].slice(0, time[i]%c_music[i].length)
       }
        if(c_music[i].includes(m)){  
            answer.push({title : c_title[i], time : time[i]});
        }
        
    }
    answer.sort((a,b)=>{     //일치하는 음악을 담은 배열값 중에 재생시간 가장 긴거찾아야함
        let A = a.time;
        let B = b.time;
        if(A>B) return -1;
        else if(A<B) return 1;
        else return 0;
    })
   
    if(answer.length ===0){
        return '(None)';
    }
    return answer[0].title;
}

 

 

# 내가 이번 문제 풀고 꼭 기억해야하는 점 

String.prototype.slice() => slice() 메소드는 문자열의 일부를 추출하면서 새로운 문자열을 반환한다.

 

문법 

str.slice(beginIndex, endIndex)
728x90
Comments