Algorithm/Programmers

155651. 호텔 대실

사랑우주인 2025. 3. 24. 23:15

문제

https://school.programmers.co.kr/learn/courses/30/lessons/155651

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

제한조건

풀이

import java.util.*;

class Solution {
    public int solution(String[][] book_time) {
        int answer = 0;
        
        List<int[]> tList = new ArrayList<>();
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        for(String[] tArr : book_time) {
            int start = timeToMinute(tArr[0]);
            int end = timeToMinute(tArr[1]);
            
            tList.add(new int[]{start, end});
            
        }
        
        Collections.sort(tList, (o1, o2) -> o1[0] - o2[0]); // 시작시간 오름차순 정렬

        
        for(int[] t : tList) {
            int start = t[0];
            int end = t[1];
            if(pq.isEmpty()) {
                pq.offer(end);
                continue;
            }
            
            int beforeEnd = pq.peek();
            if(start>= beforeEnd + 10) {
                pq.poll();
                pq.offer(end);
            }
            else {
                pq.offer(end);
            }
            
        }
        
        answer = pq.size();
        return answer;
        
    
    }
    
    int timeToMinute(String t) {
        String[] tt = t.split(":");
        return Integer.valueOf(tt[0]) * 60 + Integer.valueOf(tt[1]);
    } 
}

회고

문제를 파악하면서 정렬이 중요하다고 판단했다. 그래서 우선순위 큐를 사용해서 문제를 풀었다. 큐에 들어가는 원소는 '룸'이다. 구체적으로 설명하자면 각 원소는 룸이고 값은 대실 종료 시간이다.

대실 시작 시간을 기준으로 book_time를 정렬시켰다. 그리고 각 대실 시작 시간을 우선 순위 큐의 첫 번째 원소(룸)에 들어갈 수 있는지 확인한다. 들어갈 수 없으면 나머지 원소(룸)에도 들어갈 수 없다. 왜냐하면 우선 순위 큐는 대실 종료 시간으로 오름차순 정렬되기 때문에, 첫 번째 원소와 비교해서 예약을 할 수 없는 시간이면, 나머지 원소는 첫 번째 원소보다 대실 종료 시간이 더 늦기 때문에 확인할 필요가 없다. 대신 큐에 원소(룸)을 추가한다.

 

이 문제는 쉽다고 느끼지 못했지만 정렬이 중요 포인트라고 판단했고, 우선순위 큐가 떠올라 바로 적용해봤다. 실패 없이 한번에 통과해서 뿌듯했다.