호텔 대실

유승선 ·2024년 2월 10일
0

프로그래머스

목록 보기
42/48

객실의 사용을 최소화 해야하는 문제를 풀어봤다. 분명 이런 비슷한 류의 문제를 풀어본 기억이 있는데 기억이 안나서 혼자서 좀 많이 생각했다. 내가 풀었던 방법은 가장 먼저 모든 시간을 분으로 만들어 주고 가장 빠른 시간부터 시작하도록 정렬해줬다.

이후에는 Map을 활용해서 끝나는 시간만 저장한 뒤에 각 loop 마다 Map을 뒤져서 10분전의 시간이 존재하는지를 찾았다. 첫번째 테스트 케이스 돌릴때는 실패 했는데 방의 시간이 연속적으로 이어져야 하는거라서 한번 이어진 방을 찾았으면 그 방은 다시 스캔 안하도록 해줘야했다.

개인적으로 마음에 들지는 않은 풀이 방법이라 priority-queue 를 사용해서 다시 풀어봤다. pq에서는 결국 가장 빠르게 끝나는 시간 부터 나올거라서 현재 시간보다 -10 시간인 방들을 계속 빼주면서 q의 남아있는 방 수만큼 answer 을 업데이트 해주면 된다!

v1

#include <string>
#include <vector>
#include <bits/stdc++.h> 
using namespace std;

vector<int> convert_time(vector<string>& v){
    string start = v[0], end = v[1]; 
    int h1 = stoi(start.substr(0,2)) * 60; 
    int m1 = stoi(start.substr(3,2)); 
    
    int h2 = stoi(end.substr(0,2)) * 60; 
    int m2 = stoi(end.substr(3,2));
    
    return {h1 + m1, h2 + m2}; 
}

int solution(vector<vector<string>> book_time) {
    int answer = 0;
    vector<vector<int>> time_line; 
    map<int,int> timeMap; 
    for(vector<string>& v : book_time){
        time_line.push_back(convert_time(v)); 
    }
    
    sort(time_line.begin(), time_line.end(), [](vector<int>& a, vector<int>& b){
        return a < b; 
    }); 
    
    bool flag = true; 
    for(vector<int>& v : time_line){
        int target = v[0] - 10; 
        for(auto& it : timeMap){ //만약 퇴실 시간이 맞다면
            if(it.first <= target && timeMap[it.first] > 0){
                flag = false;
                timeMap[it.first]--; 
                break; 
            }
        }
        if(flag){
            answer++; 
        }
        timeMap[v[1]]++; 
        flag = true; 
    }
    
    
    return answer;
}

v2

```c
#include <string>
#include <vector>
#include <bits/stdc++.h> 
using namespace std;

int solution(vector<vector<string>> book_time) {
    int answer = 0;
    priority_queue<int,vector<int>,greater<int>> pq; 
    sort(book_time.begin(), book_time.end()); 
    for(vector<string>& v : book_time){
        string start_t = v[0], end_t = v[1]; 
        int nStart_t = stoi(start_t.substr(0,2)) * 60 + stoi(start_t.substr(3)); 
        int nEnd_t = stoi(end_t.substr(0,2)) * 60 + stoi(end_t.substr(3)); 
        
        while(!pq.empty() && pq.top() <= nStart_t - 10){
            pq.pop(); 
        }
        pq.push(nEnd_t); 
        answer = max(answer, (int)pq.size()); 
    }
    return answer;
}
profile
성장하는 사람

0개의 댓글