https://programmers.co.kr/learn/courses/30/lessons/17683
function solution(m, musicinfos) {
m = convertMusic(m);
var answer = '';
var correctMusic = [];
musicinfos = musicinfos.map(x => {
x = x.split(',');
var playStart = x[0].split(':');
var playEnd = x[1].split(':');
var playTime = musicPlayTime(playStart, playEnd);
var subtitle = x[2];
var sound = x[3];
sound = convertMusic(sound);
var playSound = [];
for (let i = 0; i < playTime; i++) {
playSound.push(sound[i % sound.length]);
}
playSound = playSound.join('');
if (playSound.includes(m)) {
correctMusic.push([subtitle, playTime]);
}
})
var maxtime = 0;
correctMusic.map(x => {
if (maxtime < x[1]) {
maxtime = x[1];
answer = x[0];
}
})
if(answer === ''){
return '(None)';
}
return answer;
}
function musicPlayTime(playStart, playEnd) {
const start = new Date(2021, 5, 7, parseInt(playStart[0]), parseInt(playStart[1]), 0);
const end = new Date(2021, 5, 7, parseInt(playEnd[0]), parseInt(playEnd[1]), 0);
return ((end.getTime() - start.getTime()) / 1000 / 60);
}
function convertMusic(sound) {
sound = sound.replace(/(C#)/g, 'H');
sound = sound.replace(/(D#)/g, 'I');
sound = sound.replace(/(F#)/g, 'J');
sound = sound.replace(/(G#)/g, 'K');
sound = sound.replace(/(A#)/g, 'L');
return sound;
}
문제의 중요한 포인트 들이 있다.
음에서 A
와 A#
을 구분해야한다. 음을 나눌때 split('')
으로 나누면 #
자체가 음이 되어버려서 음을 구분해야한다. 따라서 convertMusic()
으로 음을 나눈다.
음악의 총 시간을 구하는 문제도 있는데 음악은 00:00을 넘지 않는다고 되어있으므로 다음날을 고려하지는 않는 문제이다. 자신이 직접 시간을 비교하는 함수를 사용해도 되지만 빌트인 클래스인 Date()
생성자를 사용해서 오늘날짜를 넣고 시간, 분을 나눠 넣어서 getTime()
으로 빼면 밀리세컨드로 값이 나온다.
이값을 1000 , 60으로 각각 나누면 분이 나온다.
그리고 마지막으로 매칭되는 음악이 없다면 '(None)'
을 반환하는 것도 주의해야할 문제이다.
이외에는 구현 문제이다.
Date()
클래스와 getTime()
함수를 이용해서 날짜 시간경과 계산을 쉽게하자