Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- spring security
- java
- builder
- factory
- synchronized
- lombok
- Google OAuth
- OAuth 2.0
- 일급 컬렉션
- nestjs
- Dependency Injection
- middleware
- 일급 객체
- Spring
- Volatile
Archives
- Today
- Total
HJW's IT Blog
[Programmers] 호텔 대실 [c++] 본문
문제 설명
호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있습니다.
예약 시각이 문자열 형태로 담긴 2차원 배열 book_time이 매개변수로 주어질 때, 코니에게 필요한 최소 객실의 수를 return 하는 solution 함수를 완성해주세요.
제한사항
- 1 ≤ book_time의 길이 ≤ 1,000
- book_time[i]는 ["HH:MM", "HH:MM"]의 형태로 이루어진 배열입니다
- [대실 시작 시각, 대실 종료 시각] 형태입니다.
- 시각은 HH:MM 형태로 24시간 표기법을 따르며, "00:00" 부터 "23:59" 까지로 주어집니다.
- 예약 시각이 자정을 넘어가는 경우는 없습니다.
- 시작 시각은 항상 종료 시각보다 빠릅니다.
- book_time[i]는 ["HH:MM", "HH:MM"]의 형태로 이루어진 배열입니다
입출력 예
book_time result
[["15:00", "17:00"], ["16:40", "18:20"], ["14:20", "15:20"], ["14:10", "19:20"], ["18:20", "21:20"]] | 3 |
[["09:10", "10:10"], ["10:20", "12:20"]] | 1 |
[["10:20", "12:30"], ["10:20", "12:30"], ["10:20", "12:30"]] | 3 |
문제 분석
- 최소한의 객실만을 사용해야 한다
- 퇴실 시간 기준 10분 청소
- 시간을 숫자로 변환해야 한다
- 겹치는 시간에 대한 처리가 필요하다
코드
풀때 parametric search 를 사용했지만 생각해보니 충분히 +1-1 technique 로 풀 수 있겠다는 생각이 들었다
#include <bits/stdc++.h>
using namespace std;
vector<pair<int,int>> timeToInt(vector<vector<string>>& time){
vector<pair<int,int>> ret;
for(int i = 0; i<time.size(); i++){
pair<int,int> temp {0,0};
int hour, minute;
char col;
istringstream start(time[i][0]);
start >> hour >> col >> minute;
temp.first = hour * 60 + minute;
istringstream end(time[i][1]);
end >> hour >> col >> minute;
temp.second = hour * 60 + minute + 10;
ret.push_back(temp);
}
return ret;
}
bool isPossible(int num, vector<pair<int,int>>& time){
priority_queue<int, vector<int>, greater<int>> pq;
int cnt = 0, maxCnt = 0;
for(auto t : time){
while(!pq.empty() && t.first >= pq.top()){
pq.pop();
cnt--;
}
pq.push(t.second);
cnt++;
maxCnt = max(cnt, maxCnt);
if(pq.size() > num) return false;
}
return true;
}
int solution(vector<vector<string>> book_time) {
int answer = INT_MAX;
vector<pair<int,int>> time = timeToInt(book_time);
sort(time.begin(), time.end(), [](pair<int,int> a, pair<int,int> b){
return a.first < b.first;
});
int l = 0; int r = 1001;
while(l<=r){
int mid = (l+r)/2;
if(isPossible(mid, time)){
answer = min(mid,answer);
r = mid - 1;
}else l = mid + 1;
}
return answer;
}
'Algorithm' 카테고리의 다른 글
[프로그래머스 / C++ / JAVA / Javascript ] 무인도 여행 [c++] (3) | 2024.08.30 |
---|---|
[Programmers] 상담원 인원 [c++] (0) | 2024.08.29 |
[Programmers] 광물캐기 [C++] (0) | 2024.08.27 |
[프로그래머스 / C++/ Java / Javascript] 리코쳇 로봇 (0) | 2024.08.27 |
[Programmers] 연속된 부분 수열 [C++] (0) | 2024.08.26 |