옌의 로그

[Algorithm] 프로그래머스 - 셔틀버스 본문

스터디/알고리즘

[Algorithm] 프로그래머스 - 셔틀버스

dev-yen 2023. 1. 23. 20:00

문제

[프로그래머스] 셔틀버스
(2018 KAKAO BLIND RECRUITMENT)

 

사용 알고리즘

- X (구현 문제)


해결방법

콘은 출근하기 위해 셔틀버스 줄을 서는데 가장 늦게 줄을 스고자 한다. <- 이 부분에서 콘은 막차를 탈 것이라 가정

콘이 탑승하게 되는 경우는 다음과 같다.

  • 막차이고 자리가 남아있는 경우
    • 이 경우, 콘은 버스 도착 시간에 오면 된다
  • 막차이고 자리가 없는 경우
    • 이 경우, 가장 마지막으로 탑승할 수 있는 크루보다 더 일찍 와야함

그러므로, 막차가 올 때까지, 빠른 순으로 정렬한 sortedT를 가지고 크루원들을 탑승시키면서 콘이 탈 시각을 구하면 된다. 

 

소스코드

사용언어 : javascript

function solution(n, t, m, timetable) {
    var answer = '';
    let i, answerMin;
    let sortedT = timetable.sort();
    let startMin = 9 * 60;
    let arrivedT, arrivedMin;

    for (i=0; i<n; i++) {
        let nm = m;
        while (nm > 0 && sortedT.length != 0) { // 자리 남아있고 줄 선 크루가 있을 경우
            arrivedT = sortedT[0].split(":");
            arrivedMin = arrivedT[0] * 60 + parseInt(arrivedT[1]);
            if (arrivedMin <= startMin) {
                sortedT.shift(); // 탑승
                nm--;
            } else { // 줄선 사람 중에 현재 차량 탈 수 있는 사람 없음
                break;
            }
        }
        if (i+1 == n){ // 막차인 경우 콘도 타야함.
            if (nm > 0) { // 자리 남았을 경우
                answerMin = startMin;
            } else { // 자리없음 => 마지막으로 탄 애보다 일찍와야 됨.
                answerMin = arrivedMin - 1;
            } 
        } else { // 배차 시켜주기
            startMin = startMin + t;
        }
    }
    
    let answerHours = parseInt(answerMin / 60);
    let answerMinutes = answerMin % 60;
    
    if (answerHours < 10) answerHours = "0" + answerHours;
    if (answerMinutes < 10) answerMinutes = "0" + answerMinutes;
    
    answer = answerHours + ":" + answerMinutes;

    return answer;
}

HH:mm

* split(":")을 통해 H, m을 나누고, H*60을 하여 분단위로 바꾸어 계산해주었다.

 

한줄평

콘이 막차에 탈거라는 포인트를 잡고 풀면 금방푸는데, 그 생각을 못해서 초반에 좀 해맸던 문제. .ㅎㅎ

 

Comments