https://programmers.co.kr/learn/courses/30/lessons/17683
부분 문자열 비교를 묻는 문제이다. 멜로디의 각 음을 나타내는 글자는 한 글자 일수도 있고, 'C#'처럼 두글자일 수도 있다. 나는 멜로디의 문자열을 입력받아 각각의 음을 배열로 변환한 뒤에 비교를 수행했다.
ex) ["ABC#"] ==> ["A","B","C#"]
문자열 비교는 잘 했지만 문제 요구사항의 예외처리를 하나 누락하여 시간을 많이 잡아먹었다.
처음부터 코드를 잘 짜자 라는 것을 다시금 생각했다..나의 3시간....
function allTime(start, end) {
let start_h = start.split(":")[0];
let start_m = start.split(":")[1];
let end_h = end.split(":")[0];
let end_m = end.split(":")[1];
return (end_h - start_h) * 60 + (end_m - start_m); //총 재생시간
}
function makeRecord(record) {
let tmpRecord = record.split("");
let newRecord = [];
for (let i = 0; i < tmpRecord.length; i++) {
if (tmpRecord[i] !== "#") {
newRecord.push(tmpRecord[i]);
} else {
newRecord.pop();
newRecord.push(`${tmpRecord[i - 1]}#`);
}
}
return newRecord;
}
function makeAllPlayRecord(time, record) {
let allRecord = [];
for (let i = 0; i < time; i++) {
allRecord.push(record[i % record.length]);
}
// console.log(allRecord);
return allRecord;
}
function solution(m, musicinfos) {
let startTime = [];
let endTime = [];
let musicName = [];
let orgRecord = [];
let allTimes = [];
let allRecord = [];
let mm = makeRecord(m);
for (let i = 0; i < musicinfos.length; i++) {
let splitMusicinfos = musicinfos[i].split(",");
startTime[i] = splitMusicinfos[0];
endTime[i] = splitMusicinfos[1];
musicName[i] = splitMusicinfos[2];
orgRecord[i] = makeRecord(splitMusicinfos[3]);
allTimes[i] = allTime(startTime[i], endTime[i]);
allRecord[i] = makeAllPlayRecord(allTimes[i], orgRecord[i]);
}
let music = "";
let tmpTime = 0;
for (let i = 0; i < musicinfos.length; i++) {
for (let j = 0; j <(allRecord[i].length-(mm.length-1)); j++) {
for (let k = 0; k < mm.length; k++) {
if (allRecord[i][j + k] !== mm[k]) {
break;
}
if (k === mm.length - 1) {
if (!music) {
music = musicName[i];
tmpTime = allTimes[i];
} else if (music) {
if (allTimes[i] > tmpTime) {
tmpTime = allTimes[i];
music = musicName[i];
}
}
}
}
}
}
if(!music) music = '(None)';
return music;
}