어흥

[프로그래머스] 셔틀 버스 (C++) 본문

알고리즘/프로그래머스

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

라이언납시오 2020. 9. 9. 23:05
728x90
반응형

문제 링크: programmers.co.kr/learn/courses/30/lessons/17678

 

코딩테스트 연습 - [1차] 셔틀버스

10 60 45 [23:59,23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59, 23:59] 18:00

programmers.co.kr

1. 주의할 점

- 문자열 처리를 통해 각 시간을 어떻게 저장할 것인지 정한다

 

2. 구현

- Arr[10] 벡터를 생성하여 셔틀의 수용인원만큼 수를 각 셔틀에 저장한다(최대 셔틀이 10개라고 적혀있다)

- 각 시간을 분으로 환산하여 V 벡터에 저장한 이후, 오름차순으로 정렬한 이후, Queue에 수를 순차적으로 넣는다

- For문을 통해 셔틀의 수만큼 반복하며 Queue가 비거나, 1개의 셔틀에 탈 수 있는 인원수 만큼 다 채웠다면 While문을 빠져나오도록 While문을 생성하여 각 셔틀에 크루가 도착하는 시간을 넣는다. 추가적으로, 크루가 셔틀보다 늦게 도착했다면 While문을 탈출한다

- 콘이 마지막 셔틀에 탈 수 있는 경우, 마지막 셔틀의 도착시간으로 설정한다. 마지막 셔틀에 탈 수 없는 경우, 마지막 셔틀에서 가장 늦게 탄 인원보다 1분 빨리 도착하게 한다(같은 시간이면 크루가 먼저 타기 때문)

 

#include <string>
#include <vector>
#include <iostream>
#include <sstream>
#include <queue>
#include <algorithm>
using namespace std;
vector<int> arr[10];

string solution(int n, int t, int m, vector<string> timetable) {
    string answer = "";
    int cnt;
    vector<int> v;
    for(int i=0;i<timetable.size();i++){
        string str,str1;
        istringstream ss(timetable[i]);
        while(getline(ss,str,',')){
            istringstream iss(str);
            int num=0,val;
            cnt=0;
            while(getline(iss,str1,':')){
                val = atoi(str1.c_str());
                if(cnt==0) num = val*60;
                else num+=val;
                cnt++;
            }
            v.push_back(num);
        }
    }
    queue<int> q;
    sort(v.begin(),v.end());
    for(int i=0;i<v.size();i++)
        q.push(v[i]);
    int ctime = 9*60,result;
    
    for(int i=0;i<n;i++){
        cnt=0;
        while(!q.empty() && cnt<m){
            int ct = q.front();     //크루 도착 시간
            if(ct>ctime) break;     //셔틀보다 늦게 오는 경우
            else{
                arr[i].push_back(ct);
                q.pop();
                cnt++;
            }
        }
        ctime+=t;
    }
    if(arr[n-1].size()<m)     //마지막 셔틀 도착시간에 도착하면 될 때
        result = ctime-t;
    
    else
        result = arr[n-1][m-1]-1;
        
    int hour = result/60;
    int min = result%60;
    if(hour<10) answer = "0"+to_string(hour);
    else answer = to_string(hour);
    answer+=":";
    if(min<10) answer += "0"+to_string(min);
    else answer += to_string(min);
    return answer;
}
728x90
반응형
Comments