반응형
1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/17683
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
복기
6/30
반응형
'프로그래머스 > 구현' 카테고리의 다른 글
[구현] 프로그래머스 '행렬 테두리 회전하기' - js (0) | 2023.05.16 |
---|---|
[구현] 프로그래머스 '수식 최대화' - js (0) | 2023.05.15 |
[투포인터] 프로그래머스 '연속된 부분 수열의 합' - js (0) | 2023.05.10 |
[투포인터] 프로그래머스 '보석 쇼핑' - js (1) | 2023.05.09 |
[투포인터] 프로그래머스 '두 큐 합 같게 만들기' - js (0) | 2023.05.08 |