[프로그래머스 Level 2] 호텔 대실 (Java)

Wonjun Seo·2023년 3월 28일
0

🚀링크

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

💻문제

🌏문제 풀이

우선, 주어진 입력이 "HH-MM" 형식으로 되어 있기 때문에, 24시간을 1440분이라고 보고, 이를 정수로 전환해준다.

모든 예약 정보를 PriorityQueue에 넣고, 시작 시간을 기준으로 오름차순 정렬을 해준다. 그 다음, ArrayList를 하나 만들어서 각 방의 대실 종료 시간을 저장해준다. 이후, PriorityQueue에서 Booking 데이터를 하나씩 빼면서 리스트에서 해당 대실 시간에 가능한 방이 있는지 확인한다. 가능한 방이 있으면 그 방의 대실 종료 시간을 업데이트 해주고, 없을 경우에는 새로운 방을 하나 추가한다.

모든 과정이 종료된 후에, ArrayList의 크기가 필요한 방의 최소 개수가 될 것이다.

💻코드

import java.util.*;

class Solution {
    
    static class Booking {
        private int start;
        private int end;
        
        public Booking(int start, int end) {
            this.start = start;
            this.end = end;
        }
    }
    
    public int solution(String[][] book_time) {
        PriorityQueue<Booking> pq = new PriorityQueue<>((o1, o2) -> (o1.start - o2.start));
        
        for(int i = 0; i < book_time.length; i++) {
            int start_h = Integer.parseInt(book_time[i][0].split(":")[0]);
            int start_m = Integer.parseInt(book_time[i][0].split(":")[1]);
            int end_h = Integer.parseInt(book_time[i][1].split(":")[0]);
            int end_m = Integer.parseInt(book_time[i][1].split(":")[1]);
            
            int start = (start_h * 60) + start_m;
            int end = (end_h * 60) + end_m;
            
            pq.add(new Booking(start, end));
        }
        
        List<Integer> end_times = new ArrayList<>();
        
        while(!pq.isEmpty()) {
            Booking b = pq.poll();
            int start = b.start;
            int end = b.end;
            
            boolean isAvailable = false;
            Collections.sort(end_times);
            for(int i = 0; i < end_times.size(); i++) {
                if(end_times.get(i) + 10 <= start) {
                    isAvailable = true;
                    end_times.set(i, end);
                    break;
                }
            }
            
            if(!isAvailable) {
                end_times.add(end);
            }
        }
        
        return end_times.size();
    }
}

0개의 댓글