[코딩테스트] 23/12/11 - 호텔 대실 (Level2)
문제 설명
호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있습니다. 예약 시각이 문자열 형태로 담긴 2차원 배열 book_time이 매개변수로 주어질 때, 코니에게 필요한 최소 객실의 수를 return 하는 solution 함수를 완성해주세요.
제한사항
- 1 ≤
book_time의 길이 ≤ 1,000book_time[i]는 [“HH:MM”, “HH:MM”]의 형태로 이루어진 배열입니다- [대실 시작 시각, 대실 종료 시각] 형태입니다.
- 시각은 HH:MM 형태로 24시간 표기법을 따르며, “00:00” 부터 “23:59” 까지로 주어집니다.
- 예약 시각이 자정을 넘어가는 경우는 없습니다.
- 시작 시각은 항상 종료 시각보다 빠릅니다.
문제풀이
- 시간 시작순으로 정렬한다.
- 이떄 끝나는 시간에 + 10을 해준다.
- 정렬된 시간을 루프하여 현재 방개수를 추가하거나 제거해준다.
- answer는 현재 방개수와 answer중 높은값을 가진다.
코드 (C++)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int TimeToMinutes(string time) {
int hours = stoi(time.substr(0, 2));
int minutes = stoi(time.substr(3, 2));
return hours * 60 + minutes;
}
int solution(vector<vector<string>> book_time) {
int answer = 0;
vector<pair<int, int>> time;
for (int i = 0; i < book_time.size(); ++i)
{
Time temp;
time.emplace_back(TimeToMinutes(book_time[i][0]), 1);
time.emplace_back(TimeToMinutes(book_time[i][1]) + 10, -1);
}
sort(time.begin(),time.end());
int cur = 0;
for (int i = 0; i < time.size(); ++i)
{
cur += time[i].second;
answer = max(answer, cur);
}
return answer;
}
피드백
- 처음에는 아래와 같이 구현하였다.
- 하지만 다른사람이 풀이한게 속도도 더빠르고 짦고 간결하다. ㅠ.ㅠ
- 방마다 시간을두고 비교해서 빈방이없으면 개수를 추가하도록했는데 그냥 현재시간에따라 방개수만 올리거나 내리면 되는간단한 문제였다.
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
int TimeToMinutes(string time) {
int hours = stoi(time.substr(0, 2));
int minutes = stoi(time.substr(3, 2));
return hours * 60 + minutes;
}
// 비교 함수
static bool CompareTasks(const Time& a, const Time& b) {
return a.first < b.first;
}
int solution(vector<vector<string>> book_time) {
int answer = 0;
vector<Time> time;
for (int i = 0; i < book_time.size(); ++i)
{
Time temp;
temp.first = TimeToMinutes(book_time[i][0]);
temp.second = TimeToMinutes(book_time[i][1])+ 10;
time.push_back(temp);
}
sort(time.begin(), time.end(), CompareTasks);
int curTime;
vector<int> room;
for (int i = 0; i < time.size(); ++i)
{
bool hasRoom = false;
int minTime = numeric_limits<int>::max();
int roomIndex = -1;
for (int r = 0; r < room.size(); ++r)
{
if (room[r] <= time[i].first && minTime > room[r] - time[i].first)
{
minTime = room[r] - time[i].first;
hasRoom = true;
roomIndex = r;
}
}
if (hasRoom)
{
room[roomIndex] = time[i].second;
}
else
{
room.push_back(time[i].second);
answer++;
}
}
return answer;
}
This post is licensed under CC BY 4.0 by the author.