프로그래머스 - [Level 3] [1차] 셔틀버스(JAVASCRIPT)

1 minute read

프로그래머스 [2018 KAKAO 블라인드] 셔틀버스

카테고리 : 시뮬레이션

풀이 과정은 다음과 같다.

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