programmers.co.kr/learn/courses/30/lessons/17678
<풀이>
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(0, 2)) * 60;
int minute = stoi(time.substr(3, 2));
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;
}
|
시뮬레이션에 대해 알아볼 수 있는 문제였습니다.
'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
[C++] 프로그래머스 - 캐시 (0) | 2021.01.11 |
---|---|
[C++] 프로그래머스 - 프렌즈4블록 (0) | 2021.01.07 |
[C++] 프로그래머스 - 뉴스 클러스터링 (0) | 2021.01.01 |
[C++] 프로그래머스 - 추석 트래픽 (0) | 2020.12.29 |
[C++] 프로그래머스 - 후보키 (0) | 2020.05.15 |