프로그래머스

프로그래머스 [1차] 셔틀버스(2018 KAKAO BLIND RECRUITMENT)

콩순이냉장고 2021. 9. 5. 16:35

문제 URL : https://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

문제 접근법 : 카카오 블라인드가 레벨3짜리라고 하기에는 애매할정도로 쉬운문제입니다.

마지막에 오는 버스에 마지막에 탈수있는 시간을 구하면 되는문제입니다.

한버스당 최대 m명을 태울수 있으니 가장먼저온

대기순서대로 버스가 오는 시간에 맞춰 최대 m명까지 채우면된다 단 버스정류장에

늦게 온사람이 버스보다 늦는다면 태우지 않으면 된다

 

그렇게 마지막 버스가 올때

자신이 타야하는데 그것도 마지막에 m명이 다탈수있으면 그중에 마지막에 탄사람 못타게 새치기

해야하는데 합법적으로 그사람보다 1분더 일찍오면 됩니다.

m명 다탈수 없다면 버스가 오는 정각에 맞춰 오면됩니다.

 

소스코드:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//By 콩순이냉장고
#include <bits/stdc++.h>
using namespace std;
int tomin(string s) {
    return stoi(s.substr(02)) * 60 + stoi(s.substr(32));
}
string totime(int time) {
    string h = to_string(time/60);
    string m = to_string(time % 60);
    if (h.size() == 1)h = "0" + h;
    if (m.size() == 1)m = "0" + m;
    return h + ":" + m;
}
string solution(int n, int t, int m, vector<string> timetable) {
    string answer = "";
    vector<int> v;
    for (string s : timetable)
        v.push_back(tomin(s));
    sort(v.begin(), v.end());//먼저오는 사람이 탈수있도록 정렬
    int idx = 0;
    for (int i = 0; i < n; i++) {
        int start = tomin("09:00"+ i * t;
        int M = m;
        //최대 m명까지 태우고 버스가 오는시간이전에 대기하고있으면 버스태움
        while (M && idx < v.size() && v[idx] <= start) {
            idx++;
            M--;
        }
 
        //마지막에 내가타야함
        if (i == n - 1) {
            if (M) {//자리가 있으면 버스가 오는정각에 타면됨
                answer = totime(start);
            }
            else {//자리가 없다면 마지막에 탔던사람보다 1분일찍와서 새치기
                answer = totime(v[idx - 1- 1);
            }
        }
    }
    return answer;
}
cs

 

 

궁금한점 혹은 모르는점 또는 논리적인 오류등 어떤질문이든 댓글은 언제나 환영입니다.

공감도 눌러주실꺼죠?