셔틀버스
카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 '크루'라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다.
이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자.
셔틀은 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 사이이다.
콘이 무사히 셔틀을 타고 사무실로 갈 수 있는 제일 늦은 도착 시각을 출력한다. 도착 시각은 HH:MM 형식이며, 00:00에서 23:59 사이의 값이 될 수 있다.
셔틀버스의 첫 출발 시각 9:00을 분으로 바꿔 540으로 start_t에 저장해두었다.
timetable 벡터는 pop_back()을 사용하기 위해 내림차순으로 정렬하였다.
반복문을 빠져나올 수 있도록 flag를 만들었다.
정렬된 timetable에서 하나씩 꺼내어 줄을 선 시간과 분을 start_t와 같이 분으로 바꾸어 wait_h와 wait_m에 저장한 뒤 그것을 합쳐 wait_t에 저장한다.
줄 선 시각이 셔틀버스 출발 시각보다 이른 시각일 때, cnt를 하나씩 늘려주며 해당 시각을 timetable에서 pop_back()해준다.
이 때 마지막 줄이고 cnt가 셔틀 버스 최대 수용인원 m보다 하나 작을 때는 출발 시각 start_t를 wait_t에서 1을 뺀 값으로, flag는 false로 바꾼 뒤 break한다.
줄 선 시각이 start_t보다 늦을 때는, 출발시각을 다음 출발시각으로 바꿔준다. 이 때 셔틀버스가 마지막 셔틀 버스일 때는 flag를 false로 바꾼 뒤 break한다.
줄이 비어있다면 출발 시각을 가장 마지막 시각으로 바꿔놓고 반복문을 탈출한다.
이렇게 반복문을 돌고 나온 start_t를 시와 분으로 나누어 출력한다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(int n, int t, int m, vector<string> timetable) {
string answer = "";
int start_t=540, wait_t=0, wait_h=0, wait_m=0;
int cnt=0;
bool flag=true;
sort(timetable.begin(),timetable.end(),greater<string>());
for(int i=0;i<n;i++){
cnt=0;
while(cnt<m){
if(!timetable.empty()){
wait_h=stoi(timetable.back().substr(0,2));
wait_m=stoi(timetable.back().substr(3,2));
wait_t=(60*wait_h)+wait_m;
if(wait_t<=start_t){
if(i==n-1 && cnt==m-1){
start_t=wait_t-1;
flag=false;
break;
}
else{
cnt++;
timetable.pop_back();
}
}
else{
if(i==n-1){
start_t=540+(n-1)*t;
flag=false;
break;
}
start_t+=t;
break;
}
}
else{
start_t=540+(n-1)*t;
flag=false;
break;
}
}
if(flag=false) break;
if(cnt==m) start_t+=t;
}
if(start_t/60<10) answer="0"+to_string(start_t/60);
else answer=to_string(start_t/60);
answer+=":";
if(start_t%60<10) answer+="0"+to_string(start_t%60);
else answer+=to_string(start_t%60);
return answer;
}