[프로그래머스] 호텔 대실(Java, 자바)

giggle·2023년 10월 27일
0

문제

호텔 대실


📌 아이디어

이 문제의 핵심은 정렬우선 순위 큐를 활용하는 것입니다.

먼저 String인 시간을 정렬할 수 있도록 Int로 변환하는 과정이 필요합니다. 이 때, 10분의 청소 시간이 필요하므로 퇴실 시간에 10분을 더해주고 만약, 60분을 넘어간다면 시간 처리를 진행합니다.

그 후, 입실 시간을 기준으로 예약리스트를 정렬하고 하나씩 탐색합니다. 우선 순위 큐가 비어있다면 방을 추가하도록 하고, 비어있지 않다면 peek 값의 퇴실시간과 현재 입실 시간을 비교하여 방 추가 여부를 판단합니다.

최종적으로 큐에 size를 파악해 정답을 도출 할 수 있습니다.


📌 코드

import java.util.*;

class Solution {
    public int solution(String[][] book_time) {
        int answer = 0;
        int[][] bookTime = new int[book_time.length][2];
        
        for (int i = 0; i<book_time.length; i++) {
            int start = Integer.parseInt(book_time[i][0].replace(":", ""));
            int end = Integer.parseInt(book_time[i][1].replace(":", ""));
            
            end += 10; // 청소 시간
            
            if (end % 100 >= 60) {
                end += 40;
            }
            
            bookTime[i][0] = start;
            bookTime[i][1] = end;
            
        }
        
        Arrays.sort(bookTime, (a1, a2) -> {
            return a1[0]-a2[0];
        });
        PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));
        for (int[] book : bookTime) {
            
            if (pq.isEmpty()) {
                pq.add(book);
            } else {
                int[] tmp = pq.peek();
                int start = tmp[0];
                int end = tmp[1];
                
                if (book[0] >= end) {
                    pq.poll();
                }
                pq.add(book);
            }
            
        }

        answer = pq.size();
        return answer;
    }
}

✏️ TIP

  1. 예약 시간들은 입실 시간을 기준으로 정렬하도록 했습니다. 그래서 아래와 같이 코드를 작성했습니다.
Arrays.sort(bookTime, (a1, a2) -> {
	return a1[0]-a2[0];
});
  1. 호텔에 배정하는 방은 퇴실 시간을 기준으로 정렬되어야 하므로 우선 순위 큐에 아래와 같은 조건을 넣어 코드를 작성했습니다.
PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));

피드백 및 개선점은 댓글을 통해 알려주세요😊

profile
배움을 글로 기록하는 개발자가 되겠습니다.

0개의 댓글