카카오에서 좋아하는 복잡한 문자열에 대한 처리이다.
다행스럽게도 JS에서는 문자열처리가 쉬운편이다.
따라서 시간에 관한 문자열들의 경우 내가 관리하기 편한 시간으로 먼저 정렬후 진행한다.
그후 자주 쓸것같은 함수들을 미리 구현한 후 풀이를 진행하면 어렵지 않게 풀수 있다.
function solution(n, t, m, timetable) {
var answer = '';
let startTime = timeToMin("09:00");
timetable = timetable.map(v => timeToMin(v)).sort( (a,b) => a-b)
for(let i=0; i< n; i++){
const curMember = getCurMember(startTime , timetable)
if(i === n-1){ // 막차 일때
if(curMember.length >= m){ // 다 탈수 있는 인원보다 기다리는 인원이 많은 경우
answer = curMember[m-1] -1 // 탈 수 있었던 마지막 인원보다 1분 일찍 들어갑니다.
}else{
answer = startTime // 현재 시간을 반환합니다.
}
}else{ // 막차가 아닌경우
timetable.splice(0, curMember.length > m ? m : curMember.length)
startTime += t
}
}
return minTotime(answer);
}
function timeToMin(string){
const [hour , min] = string.split(":")
const time = hour*60 + min *1;
return time
}
function getCurMember(curTime, curMembers ){ // number , array => array
let curMember = []
for(let i=0; i< curMembers.length; i++){
if(curMembers[i] <= curTime){
curMember.push(curMembers[i])
}else{
break;
}
}
return curMember // 현재 탈 수 있는 인원들을 반환합니다.
}
function minTotime(number){ // number => string , 0 => 00:00
const hour = Math.floor(number/60) < 10 ? "0"+Math.floor(number/60) : ""+Math.floor(number/60);
const min = Math.floor(number%60) < 10 ? "0" + Math.floor(number%60) : ""+Math.floor(number%60);
const time = hour+":"+min
return time
}