[프로그래머스][1차]셔틀버스(C++)

갭라·2021년 8월 31일
0

문제링크 - [1차]셔틀버스

🤔문제 설명

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

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

셔틀은 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;
}
profile
준비생!

0개의 댓글