https://school.programmers.co.kr/learn/courses/30/lessons/17683
문제 접근
- 문제의 핵심은 '#'을 어떻게 처리할 지가 관건이었습니다. 성공한 풀이는 정규표현식으로 문자열 뒤에 오는 '#'을 검색하고 해당 문자열과 '#'을 함께 소문자로 바꾸고 문제를 풀었습니다. 네오가 기억한 멜로디를 재생 시간 동안 반복된 멜로디에 split하여 나뉘면 해당되고 나뉘지 않다면 해당 곡이 아니라 판단하였습니다.
function solution(m, musicinfos) {
const result = {};
const newM = m.replace(/(C|D|F|G|A)#/g, (_, p1) => p1.toLowerCase());
for (let unit of musicinfos) {
let [startTime, endTime, title, musicCode] = unit.split(',');
let [startHour, startMin] = startTime
.split(':')
.map((v) => parseInt(v, 10));
let [endHour, endMin] = endTime.split(':').map((v) => parseInt(v, 10));
// 노래 재생 시간
const playingTime = (endHour - startHour) * 60 + (endMin - startMin);
const newMusicCode = musicCode.replace(/(C|D|F|G|A)#/g, (_, p1) =>
p1.toLowerCase()
);
const musicTime = newMusicCode.length;
const repeatNum = Math.ceil(playingTime / musicTime);
const playingCode = newMusicCode.repeat(repeatNum).slice(0, playingTime);
const playingCodeArr = playingCode.split(newM);
if (playingCodeArr.length !== 1) {
result[title] = playingTime;
}
}
const resultArr = Object.entries(result);
if (resultArr.length > 0) {
// 재생시간 긴 순서로 정렬
answer = resultArr.sort((a, b) => b[1] - a[1])[0][0];
} else {
answer = '(None)';
}
console.log(answer);
return answer;
}
삽질
실패 2 - 문자열로 처리하면 '#'의 대한 처리를 계속 해줘야 함. 엣지 케이스를 다 통과했지만 문자열로 문제를 풀면 60점 이상을 맞지 못했다...
function solution(m, musicinfos) {
const result = {};
let answer = '';
for (let unit of musicinfos) {
let [startTime, endTime, title, musicCode] = unit.split(',');
let [startHour, startMin] = startTime
.split(':')
.map((v) => parseInt(v, 10));
let [endHour, endMin] = endTime.split(':').map((v) => parseInt(v, 10));
let playingTime = (endHour - startHour) * 60 + (endMin - startMin);
let musicTime = musicCode.length;
let sharpCount = musicCode.split('#').length - 1;
let totalCodeCount = playingTime + sharpCount;
let repeatNum = Math.ceil(totalCodeCount / musicTime);
let playingCode = musicCode.repeat(repeatNum).slice(0, totalCodeCount + 1);
if (playingCode.slice(-1) !== '#' && playingCode.length !== 1) {
playingCode = playingCode.slice(0, -1);
}
const playingCodeArr = playingCode.split(m); // ABC ABC#DF '' #DF
if (playingCodeArr.length !== 1) {
if (playingCode[1] && playingCode[1].slice(0) !== '#') {
result[title] = playingTime;
}
if(playingCodeArr.every((el) => !el)){
result[title] = playingTime;
}
}
}
const resultArr = Object.entries(result)
if (resultArr.length > 0) {
answer = resultArr.sort((a,b) => {
if(a[1] > b[1]) return -1
if(a[1] < b[1]) return 1
})[0][0]
} else {
answer ='(None)';
}
console.log(answer)
return answer
}
'algorithm > programmers' 카테고리의 다른 글
[JS] 전력망 둘로 나누기 -bfs (0) | 2023.10.24 |
---|---|
[JS] 오픈채팅방 - Object와 Map의 차이점 (0) | 2023.10.10 |
[PYTHON/파이썬] Level2 [1차]캐시 - LRU/deque/maxlen (0) | 2023.02.18 |
[PYTHON/파이썬] level 2 괄호회전하기 - deque (0) | 2023.02.18 |
[PYTHON/파이썬] Level2 행렬의 곱셈 - 3중 for문 / zip (0) | 2023.02.09 |
댓글