프로그래머스 LEVEL 2(방금그곡)
-
사용 언어 : 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