[프로그래머스] [1차] 셔틀버스

1 minute read

문제 설명

카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 ‘크루’라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다.

이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자.

셔틀은 09:00부터 총 n회 t분 간격으로 역에 도착하며, 하나의 셔틀에는 최대 m명의 승객이 탈 수 있다. 셔틀은 도착했을 때 도착한 순간에 대기열에 선 크루까지 포함해서 대기 순서대로 태우고 바로 출발한다. 예를 들어 09:00에 도착한 셔틀은 자리가 있다면 09:00에 줄을 선 크루도 탈 수 있다. 일찍 나와서 셔틀을 기다리는 것이 귀찮았던 콘은, 일주일간의 집요한 관찰 끝에 어떤 크루가 몇 시에 셔틀 대기열에 도착하는지 알아냈다. 콘이 셔틀을 타고 사무실로 갈 수 있는 도착 시각 중 제일 늦은 시각을 구하여라.

단, 콘은 게으르기 때문에 같은 시각에 도착한 크루 중 대기열에서 제일 뒤에 선다. 또한, 모든 크루는 잠을 자야 하므로 23:59에 집에 돌아간다. 따라서 어떤 크루도 다음날 셔틀을 타는 일은 없다.

제한사항

셔틀 운행 횟수 n, 셔틀 운행 간격 t, 한 셔틀에 탈 수 있는 최대 크루 수 m, 크루가 대기열에 도착하는 시각을 모은 배열 timetable이 입력으로 주어진다.

  • 0 < n ≦ 10
  • 0 < t ≦ 60
  • 0 < m ≦ 45
  • timetable은 최소 길이 1이고 최대 길이 2000인 배열로, 하루 동안 크루가 대기열에 도착하는 시각이 HH:MM 형식으로 이루어져 있다.
  • 크루의 도착 시각 HH:MM은 00:01에서 23:59 사이이다.

풀이

60분
크루들의 도착 시간에 따라 버스를 배정해주고, 가장 마지막 버스에 자리가 있다면 해당 버스의 도착시간을, 자리가 없다면 해당 버스에 타기로한 크루 중 가장 늦게 도착하는 크루보다 1분 빠른 시간을 구했다. 과정이 어렵기 보다는, 문제 자체가 이해가 안 되서 시간이 많이 걸렸다.

코드

// 11:20 ~  12:20
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string solution(int n, int t, int m, vector<string> timetable) {
    vector<int> bus[10];
    int latest = -1;
    int hh,mm, now;
    
    sort(timetable.begin(), timetable.end());
    
    for(string arrive : timetable){
        hh = stoi(arrive.substr(0,2));
        mm = stoi(arrive.substr(3,2));
        now = hh*60 + mm;
        
        for(int i = 0; i <n; ++i){
            if(bus[i].size() == m) continue;
            if(9*60 + i * t >= now){
                bus[i].push_back(now);
                break;
            }
        }
        
    }
    
    if(bus[n-1].size() < m){
        latest = 9*60 + (n-1) * t;
    }
    else{
        latest = bus[n-1][bus[n-1].size() - 1] - 1;
    }
    
    hh = latest / 60;
    mm = latest % 60;
    
    string hs = to_string(hh);
    string ms = to_string(mm);
    if(hs.size() == 1) hs = '0' + hs;
    if(ms.size() == 1) ms = '0' + ms;
    
    return hs + ':' + ms;
}