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

1 minute read

문제 링크

문제 설명

  • 9:00 부터 t 분 간격으로 n 회 운영하는 셔틀버스가 있다.
  • 카카오 직원인 크루들은 00:01 부터 23:59 사이의 시간에 셔틀버스 정류장에 도착한다.
  • 직원 중 한명인 콘은 사무실에 가장 늦게 도착하는 시간으로 셔틀버스를 이용하려고 한다.
  • 콘은 같은 시간에 셔틀버스 정류장에 도착해도 다른 크루들의 맨 뒤에 선다.
  • 콘이 정류장에 도착해야 하는 가장 늦은 시간을 구하라.

문제 접근

  • 문제 풀이의 핵심은 콘은 최대한 마지막 셔틀 버스를 타야한다는 점이다.
  • 즉, 중요한 점은 마지막 버스에 자리가 있느냐 없느냐를 판단해야 한다.
    • 자리가 있다면 마지막 버스가 출발하는 시간에 맞춰서 정류장에 도착하면 된다.
    • 자리가 없다면 가장 마지막에 버스를 탔던 크루의 시간보다 1분 일찍 도착하면 된다.
      • 위 로직이 성립하는 이유는 같은 시간에 도착한 크루가 여러 명이 있더라도 1분이라도 그들보다 앞선다면, 마지막 혹은 이전의 셔틀버스를 탈 수 있기 때문이다.

구현(All Pass)

#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <algorithm>
using namespace std;

string solution(int n, int t, int m, vector<string> timetable) {
    vector<int> crewTable;
    string answer = "";
    stringstream stm;
    int hh, mm;
    for(int i=0; i<timetable.size(); i++){
        stm.clear();
        stm.str(timetable[i]);
        stm >> hh; stm.get(); stm>>mm;
        int time = hh*60 + mm;
        crewTable.push_back(time);
    }
    sort(crewTable.begin(), crewTable.end());
    int busTime = 540;
    int idx=0, cnt=0, time = 0;
    for(int i=0; i<n; i++){
        cnt=0;
        for(int j=idx; j<crewTable.size(); j++){
            if(crewTable[j] > busTime) break;
            cnt++; idx++;
            if(cnt == m) break;
        }
        // 마지막 버스에 몇명이 탔는지만 중요!
        if(i==n-1){
            if(cnt == m)
                time = crewTable[idx-1]-1;
            else
                time = busTime;
        }
        busTime += t;
    }
    
    hh = time/60;
    mm = time%60;
    if(hh<10) answer += "0";
    answer += to_string(hh) + ":";
    if(mm<10) answer += "0";
    answer += to_string(mm);
    
    return answer;
}

Leave a comment