baekjoon, programmers

programmers 호텔 대실 c++

leon-mcd 2024. 6. 30. 19:29

programmers

level2 호텔 대실

문제 설명

다양한 예약시간이 주어지고 모든 호텔 이용객을 수용할 수 있는 최소한의 방 개수를 구하는 문제이다.

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

//대소비교를 용이하게 하기위해 시간을 모두 분으로 환산하고 오름차순으로 정렬한다. 방을 사용하기 시작하는 시간이면 1 끝나는 시간이면 -1로 저장하고 정렬했으니까 어떠한 예약이든 합은 0이다. 하지만 최대로 몰리는 시간에 필요한 최소한의 방의 수가 필요한 것이므로 방이 가장 많이 열려있는 시점에 방의 개수를 기록하면 된다.  

int solution(vector<vector<string>> book_time) {
    int answer = 0;
    vector<pair<int,int>> reserved_time;    //first=start, second=end, convert to minute
    for(int i=0; i<book_time.size(); i++){
        reserved_time.push_back({stoi(book_time[i][0].substr(0, 2)) * 60 + stoi(book_time[i][0].substr(3, 2)), 1}); // Start time, mark as 1
        reserved_time.push_back({stoi(book_time[i][1].substr(0, 2)) * 60 + stoi(book_time[i][1].substr(3, 2)) + 10, -1}); // End time, mark as -1, sum 10min to clean room
    }

    sort(reserved_time.begin(), reserved_time.end());

    int max_opened_room = 0;
    int cur_opened_room = 0;

    for(int i=0; i<reserved_time.size(); i++){
        cur_opened_room += reserved_time[i].second;
        max_opened_room = max(max_opened_room, cur_opened_room);
    }

    return max_opened_room;
}

해결 과정

처음에 입출력 예 설명에 나와있는 그림 때문에 시작 시간과 종료 시간을 함께 다뤄야 한다고 생각했다.
방 vector를 생성하고 시간과 함께 방을 추가하는 방식으로 진행하려고 했지만 예약의 길이가 최대 1000개이고 모두 같은 시간이라고 가정할 때 k*1000!번 비교연산을 진행할 것으로 예상되어 진행하지 않았다.
해결한 뒤에 다른사람의 풀이를 보니 priority queue를 이용한 풀이도 있던 데, 참고해봐야겠다.

'baekjoon, programmers' 카테고리의 다른 글

programmers 최솟값 만들기  (0) 2024.07.02
programmers 올바른 괄호  (0) 2024.07.02
programmers 최댓값과 최솟값  (0) 2024.07.01