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. 셔틀버스를 타고 갈 수 있는 가장 늦은 시간을 반환한다.

 

<해법>

이 문제는 특별한 아이디어를 통해 푸는 문제가 아니라고 생각합니다. 시뮬레이션을 구현하고, 그에 따라 답을 구하는 방식의 문제라고 생각합니다. 저는 아래 그림과 같은 방법으로 시뮬레이션을 구현하였고 답을 구하였습니다.

 

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
 
using namespace std;
 
priority_queue<int, vector<int>, greater<int>> timetable_int;
queue<int> line;
 
//문자열 시간 -> int 시간으로 바꾸기
int toIntTime(string time) {
 
    int res = 0;
 
    int hour = stoi(time.substr(02)) * 60;
    int minute = stoi(time.substr(32));
 
    res = hour + minute;
 
    return res;
}
 
//int 시간 -> 문자열 시간으로 바꾸기
string toStringTime(int time) {
 
    string res = "";
 
    string hour = to_string(time / 60);
    if (hour.length() < 2) {
        hour = "0" + hour;
    }
 
    string minute = to_string(time % 60);
    if (minute.length() < 2) {
        minute = "0" + minute;
    }
 
    res = hour + ":" + minute;
 
    return res;
}
 
string solution(int n, int t, int m, vector<string> timetable) {
 
    string answer = "";
 
    //정답으로 바꿀 int형 시간
    int answerTime_int = 0;
 
    //문자열 시간을 int형 시간으로 바꾼 후, 우선순위 큐에 저장
    for (int i = 0; i < timetable.size(); i++) {
 
        int time = toIntTime(timetable[i]);
 
        timetable_int.push(time);
    }
    
    //셔틀 버스 반복 수행
    for (int i = 0; i < n; i++) {
 
        //버스 오는 시간
        int busTime = 540 + i * t;
 
        //버스 오는 시간 전까지 도착한 사람 줄 세우기
        while (true) {
            if (timetable_int.empty() || timetable_int.top() > busTime) {
                break;
            }
            line.push(timetable_int.top());
            timetable_int.pop();
        }
 
        /*
        줄 서 있는 사람 수 < 버스에 태울 수 있는 사람 수 일 경우,
        버스가 오는 시간에 맞춰 도착하면 된다.
        */
        if (line.size() < m) {
            answerTime_int = busTime;
            for (int j = 0; j < line.size(); j++) {
                line.pop();
            }
        }
        /*
        줄 서 있는 사람 >= 버스에 태울 수 있는 사람 수 일 경우,
        버스에 탈 수 있는 마지막 사람보다 1분 일찍오면 된다.
        */
        else {
            for (int j = 0; j < m - 1; j++) {
                line.pop();
            }
            answerTime_int = line.front() - 1;
            line.pop();
        }
    }
 
    //결과
    answer = toStringTime(answerTime_int);
 
    //결과 반환
    return answer;
}
 

 

시뮬레이션에 대해 알아볼 수 있는 문제였습니다.

+ Recent posts