Bin's Blog

[프로그래머스] Level2 - 방금그곡(Javascript) 본문

Algorithm

[프로그래머스] Level2 - 방금그곡(Javascript)

hotIce 2023. 5. 13. 11:08
728x90
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

▶ 문제 요약

1. 방금그곡 서비스에 음악 제목, 재생이 시작되고 끝난 시각, 악보를 제공한다.

2. 네오가 기억한 멜로디와 악보에 사용되는 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12개이다.

3. 각 음은 1분에 1개씩 재생된다. 음악은 반드시 첨부터 재생되며 음악 길이보다 재생된 시간이 길 때는 음악이 끊김 없이 처음부터 반복해서 재생된다. 음악 길이보다 재생된 길이가 짧을 때는 처음부터 재생 시간만큼만 재생된다. 

4. 조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.

5. 조건이 일치하는 음악이 없을 때에는 "(None)"을 반환한다.

 

▶ 정답 코드

function solution(m, musicinfos) {
     let answer = "";
     let maxTime = 0;
     
     // 정규 표현식을 활용해서 뒤에 #이 붙어있으면 #을 없애고 앞에 글자를 소문자로 바꾼다.
     m = m.replace(/([A-G])#/g, (match) => match[0].toLowerCase());
     
     for (const music of musicinfos) {
         // ,기준으로 나누기
         let split = music.split(",");
         let [start, end, title, note] = split;
         // 시간이랑 분을 나누기
         const [startHour, startMinute] = start.split(":").map(Number);
         const [endHour, endMinute] = end.split(":").map(Number);
         // 재생시간 
         let playingTime = (endHour - startHour) * 60 + (endMinute - startMinute);
         
         // note도 #이 있는 악보 소문자로 바꾸기
         note = note.replace(/([A-G])#/g, (match) => match[0].toLowerCase());
         
         
         let noteLength = note.length; 
         let melody = "";
         
        
         // 현재 재생시간이 악보의 길이보다 크면
         if (playingTime > noteLength) {
             // 악보가 완전히 재생되는 횟수
             let repeatCount = Math.floor(playingTime / noteLength);
             // 완전히 재생되지 않고 일부만 재생되는 악보의 길이
             let remainder = playingTime % noteLength;
             
             // 최종 멜로디 만들기
             melody = note.repeat(repeatCount) + note.slice(0, remainder);
             
         // 음악 길이보다 재생된 시간이 짧으면 재생 시간만큼만 재생된다.
         } else {
             
             melody = note.slice(0, playingTime);
         }
         
         // 다 만들어진 멜로디에 음이 맞는지 체크
         if (melody.includes(m)) {
            // 재생된 시간이 가장 긴 음악을 찾기
            if (playingTime > maxTime) {
               maxTime = playingTime;
               answer = title;
            }
         }
     
     }
     // 조건이 일치하는 음악 없으면 None 출력
     return answer || "(None)"

}

 

 

728x90