본문 바로가기

프로그래머스/구현

[구현] 프로그래머스 '방금그곡' - js

반응형

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/17683

 

프로그래머스

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

programmers.co.kr

2. 구현

function solution(m, musicinfos) {
    let answer = '(None)';
    
    let tempTime = 0; // 음악이 여러 개일경우 제일 긴 음악을 찾기 위한 변수
    
    for(let i = 0; i<musicinfos.length; i++) {
        const [start, end, title, melody] = musicinfos[i].split(',');
        const time = getMinute(end) - getMinute(start);
        
        let allMelody = '';
        const melodyArr = melodyToArray(melody); // 각 음이 포함된 배열
        for(let j = 0; j<time; j++) { // 시간만큼 멜로디 길이 맞춰주기
            const idx = j % melodyArr.length;
            allMelody += melodyArr[idx];
        }
        
        if(findMelody(allMelody, m) && tempTime < time) {
            tempTime = time;
            answer = title;
        }
    }
    
    return answer;
}

// 분 단위로 변환
function getMinute(time) {
    const [hh, mm] = time.split(':');
    
    return (+hh * 60) + +mm;
}

// 멜로디가 일치하는지 확인
function findMelody(allCode, targetCode) {
    const mIdx = allCode.indexOf(targetCode);
    
    if(mIdx !== -1) { 
        // allCode가 ABC#ABC#일 때, 
        // targetCode가 ABC 또는 ABC# 인 경우 둘 다 mIdx가 구해질 것이므로 
        // 멜로디 맨마지막 요소인 #까지 확인해야 함
        const nextIdx = mIdx + targetCode.length;
        
        // #까지 동일한지 확인
        // 만약 #까지가 멜로디면 if문에 걸리지 않음
        if(allCode[nextIdx] === '#') {
        	// # 다음 부분부터 다시 검사
            return findMelody(allCode.slice(nextIdx + 1), targetCode);
        }
            
        return true;
    }
    
    return false;
}

// 멜로디를 array형태로 변환 ['A', 'C#', 'E', D#']
function melodyToArray(str) {
    const arr = [];
    
    for(let i = 0; i<str.length; i++) {
        if(str[i] === '#') continue;
        
        let targetStr = str[i];
        if(str[i + 1] === '#') targetStr += '#';
        arr.push(targetStr);
    }
    
    return arr;
}

코드 이해에도 시간이 조금 걸렸을 정도로 어려웠던 문제.. 이런 문제가 코테에 나오는거겠지? 이런 빡구현에 겁나 복잡한 문제가!!!??!!?(자아분열 + 전의상실)

 

이해에 참고한 블로그)

https://kkj6670.github.io/board/algorism/programmers-level2-3

 

프로그래머스 방금그곡 자바스크립트

[문제링크](https://programmers.co.kr/learn/courses/30/lessons/17683) 풀이최종채점에서 자꾸 몇개가 틀리는 경우가 생겨서 조금 해맸었는데 여러개가 일치할때 처리하는 조건이 있었다. 다음부터는 문제를

kkj6670.github.io

 

복기

6/30
반응형