프로그래머스 - [Level 3] [1차] 셔틀버스(JAVASCRIPT)
카테고리 : 시뮬레이션
풀이 과정은 다음과 같다.
1) timetable 배열을 오름차순 sorting 한다.
2) timetable 배열의 원소를 분 단위로 치환한다.
시간 순으로 비교하기 편리하다.
예: 09:00 => 540
3) 횟수 n을 기준으로 탐색한다.
이때, 출발 시간 = 540(첫차) + n*t(분) 이 된다.
(단, n=0 부터 시작해야 첫차부터 계산할 수 있다.)
if(!마지막 차){
사람을 태워 보낸다.
//이때 조건은 "현재 index의 도착 시간 <= 차량 출발 시간"인 경우이다.
}
else if(마지막 차){
마지막 차를 타려고 대기하는 사람이 m명 미만이면,
"마지막 차의 출발시간"이 답이 된다.
마지막 차를 타려고 대기하는 사람이 m명 이상이면,
"m 번째 대기자의 도착시간 - 1" 이 답이 된다.
}
* 실수
1) timetable 치환 후 기본 sorting(sort()) => 실패
timetable 치환 후 오름차순 sorting(sort((a,b)=>a-b)) => 성공
2) timetable sorting 후 치환 => 성공
실패 테스트 케이스
7, 17, 18 ,22
소스 코드
function solution(n, t, m, timetable) {
timetable.sort();
const minuteTimetable=timetable.map(a=>{
return a.split(":")[0]*60+a.split(":")[1]*1;
});
const makeTime=(time)=>{
let fhour=Math.floor(time/60);
let hour=(fhour+"").length===2?fhour+"":("0"+fhour);
let minute=(time%60+"").length===2?time%60+"":("0"+time%60);
return hour+":"+minute;
}
const makeAnswer=()=>{
let idx=0,myTime=0;
for(let i=0;i<n;i++){
let arriveTime=540+i*t;
let count=0;
myTime=arriveTime;
if(i<n-1){
for(let j=idx;j<minuteTimetable.length;j++){
if(minuteTimetable[j]<=arriveTime){
idx++; count++;
}
if(count===m) break;
}
}
else{
for(let j=idx;j<minuteTimetable.length;j++){
if(minuteTimetable[j]<=arriveTime) count++;
if(count===m){
myTime=minuteTimetable[j]-1;
break;
}
}
}
}
return myTime;
}
//minuteTimetable.sort();
return makeTime(makeAnswer());
}
다른 사람의 풀이
함수형 풀이는 언제나 간결하다 굿
function solution(n, t, m, timetable) {
const getTime = time => time.substr(0, 2) * 60 + +time.substr(3);
let answer = getTime('09:00'),
last = (n - 1) * t + answer,
crews = timetable.map(getTime).sort((a, b) => a - b).filter(v => v <= last);
for (let i = 0; i < n; i++) {
let crewsNum = crews.filter(crew => answer >= crew).length;
if (i === n - 1) {
if (crewsNum >= m) answer = crews[m - 1] - 1;
} else {
crews.splice(0, crewsNum > m ? m : crewsNum);
answer += t;
}
}
return String(Math.floor(answer / 60)).padStart(2, '0') + ':' + String(answer % 60).padStart(2, '0');
}
Leave a comment