프로그래머스 LEVEL 2(방금그곡)

image

  • 사용 언어 : javascript

  • 해결 날짜 : 2022-11-23

  • 해결 방법 :
    • ‘C#’과 같은 #이 붙은 음에 대한 치환 수행
    • musicinfos를 돌며
      • 재생된 시간을 구하되, ‘00:00’과 같은 경우 재생 시간이 음수가 되는 것을 방지해 음수일 경우 1440을 더함
      • 재생된 시간 만큼 재생된 멜로디를 playedMelody에 저장
      • playedMelody가 m을 포함할 때
        • 현재 저장된 정답 시간보다 긴 경우라면 update
  • 회고 :
    • 처음에 시간을 minute으로 변환하는 과정에서 * 1을 수행하지 않아 숫자 * 문자열 연산이 돼버렸다..
    • 그리고 아무리 수정해도 30번 테스트 케이스가 통과되지 않아서 계속 고심하고 고심했는데…
      • 문자열을 치환하는 과정에서 C#, D#, F#, G#, A#, E#을 Q,W,E,R,T로 치환했는데 E가 이미 존재했다…
      • 제발 대충 보지 말고 꼼꼼하게 읽자
  • 코드

    function solution(m, musicinfos) {
        let answer = '(None)';
        let tempPlayedTime = 0;
        const replaceMelody = [[/C#/g, 'c'], [/D#/g, 'd'], [/F#/g, 'f'], [/G#/g, 'g'], [/A#/g, 'a'], [/E#/g, 'e']];
            
        const replaceToOnlyAlpha = (str) => {
            let replaced = str;
            for (const [origin, to] of replaceMelody) {
                replaced = replaced.replace(origin, to);
            }
            return replaced;
        }
            
        m = replaceToOnlyAlpha(m);
            
        const toMinute = (t) => {
            return (t[0] * 60) + (t[1] * 1);
        }
            
        const getPlayedMelody = (melody, musicTime, playedTime) => {
            return melody.repeat(playedTime / musicTime) + melody.substring(0, playedTime % musicTime);
        }
            
        for (const musicinfo of musicinfos) {
            const [startTime, endTime, title, melody] = musicinfo.split(',');
            const replacedMelody = replaceToOnlyAlpha(melody);
            const musicTime = replacedMelody.length;
            let playedTime = toMinute(endTime.split(':')) - toMinute(startTime.split(':'));
                
            if (playedTime < 0) playedTime += 1440;
                
            const playedMelody = getPlayedMelody(replacedMelody, musicTime, playedTime);
                
            if (playedMelody.includes(m)) {
                if (playedTime > tempPlayedTime) {
                    answer = title;
                    tempPlayedTime = playedTime;
                } 
            }
        }
            
        return answer;
    }
    
  • 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges