호텔 대실

eunheelog·2023년 6월 12일
0

programmers

목록 보기
10/15

프로그래머스 - 호텔 대실

문제


호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 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)
    → 예약 시각이 자정을 넘어가는 경우는 없다.
    → 시작 시각은 항상 종료 시각보다 빠르다.

💡Idea

  1. 우선 시간을 통일해주자 !
    → ":"을 기준으로 앞 뒤로 시간, 분으로 나눠서 시간 * 60 + 분으로 바꾼다.
  2. i = 0 ~ (23 * 60 + 59)분까지 돌면서 비교하자.
    ① 시작시각 비교
    → 만약 i와 시작시각이 같다면 queue에 넣자
    ② 종료시각 비교 (queue size만큼 돌기)
    → i와 종료시각이 같다면 queue 에서 pop !
    → i와 종료시각이 다르다면 push 후 pop.
  3. 최소 객실의 수를 어떻게 구할까?
    → queue의 size와 answer을 비교해서 max값으로 갱신해주기

[ SourceCode ]

#include <string>
#include <vector>
#include <iostream>
#include <queue>
#include <algorithm>

using namespace std;

bool compare(pair<int, int> a, pair<int, int> b) {
    if(a.first == b.first) { // 시작 시간이 같으면
        return a.second < b.second; // 종료 시간이 빠른 순
    }
    return a.first < b.first; // 시작 시간이 빠른 순서대로
}

int solution(vector<vector<string>> book_time) {
    int answer = 0;
    vector <pair<int, int>> list(book_time.size());
    for(int i=0; i<book_time.size(); i++) {
        int h = stoi(book_time[i][0].substr(0, 2));
        int m = stoi(book_time[i][0].substr(3, 2));
        list[i].first = h * 60 + m;
        h = stoi(book_time[i][1].substr(0, 2));
        m = stoi(book_time[i][1].substr(3, 2));
        list[i].second = h * 60 + m + 10;
    }
  
    sort(list.begin(), list.end(), compare);
   
    queue <int> tmp;
    int idx = 0, time = 23 * 60 + 59;
    for(int i=0; i<=time; i++) {
        if(idx >= book_time.size()) break;
        while(list[idx].first == i) {
            tmp.push(list[idx].second);
            idx++;
        }
       
        int n = tmp.size();
        while(n--) {
            if(tmp.front() == i) {
                tmp.pop();
            }
            else {
                tmp.push(tmp.front());
                tmp.pop();
            }
        }
       
        if(answer < tmp.size()) {
            answer = tmp.size();
        }
    }
   
    return answer;
}

Feedback


  1. 10분간 청소를 하고 사용 가능하다는 걸 빼먹었다,,
    → 종료시각에 10분 더해줌
    (당연한 얘기지만,, 조건 항상 잘 보자 !!!)
  2. 제일 처음에 queue의 front값과 i가 같을 때까지 pop하는 형식으로 구현하였다.
    → 생각해보니 이렇게 되면 시작시각이 제일 빠르지만 종료시각이 제일 늦을 경우 계속 누적되는 문제 발생,,
    → queue의 크기 만큼 돌면서 다 확인해줌
profile
⛧1일 1알고리즘⛧

0개의 댓글