Lewis's Tech Keep

[프로그래머스][JAVA] 호텔 대실 본문

Java/알고리즘

[프로그래머스][JAVA] 호텔 대실

Lewis Seo 2024. 7. 30. 21:25

링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

설명

아래 그림은 프로그래머스 예제에서 가져왔다.

문제에서는 각 예약은 퇴실 후 청소 시간이 10분이 있다.

그렇다면 한  Room 예약은 14:10 ~ 19:20 이라도 실제로 사용 가능한 시간은 19:30 부터 인 것이다.

 

각 Room 예약을 List에 저장하고 PriorityQueue에도 시작시간 기준으로 정렬해서 넣도록 먼저 추가했다.

List는 시작 시간 기준으로 정렬된 Room 예약에 겹치는 것이 몇 개 있는 지 체크하기 위한 배열이다.

ProrityQueue는 왼쪽 시작 시간 기준으로 하나씩 체크하기 위한 큐다.

 

ProrityQueue에서 Room 예약을 하나씩 꺼내면서 endTime = (Room 예약 + 청소 시간) 을 기준으로

List에서 시작 시간이 endTime 보다 전이고 종료 시간이 endTime 과 같거나 큰 시간의 개수를 구한다.

(= 방 예약을 같은 시간대에 한 것의 개수)

 

풀이

더보기
import java.util.*;

class Solution {
    public int solution(String[][] book_time) {
        int answer = 0;
        PriorityQueue<BookTime> pq = new PriorityQueue<>();
        List<BookTime> bookTimes = new ArrayList<>();
        for (String[] book: book_time) {
            int startMin = Integer.parseInt(book[0].split(":")[0]) * 60 + Integer.parseInt(book[0].split(":")[1]);
            int endMin = Integer.parseInt(book[1].split(":")[0]) * 60 + Integer.parseInt(book[1].split(":")[1]);
            BookTime bookTime = new BookTime(startMin, endMin + 10);
            pq.add(bookTime);
            bookTimes.add(bookTime);
        }
        
        while(!pq.isEmpty()) {
            BookTime bookTime = pq.poll();
            // 청소타임 10분 추가
            int currentEndTime = bookTime.getEndMin();
            int count = 0;
            for (BookTime checkBookTime: bookTimes) {
                int checkStartTime = checkBookTime.getStartMin();
                int checkEndTime = checkBookTime.getEndMin();
                if (checkStartTime < currentEndTime && currentEndTime <= checkEndTime) {
                    count++;
                }
            }
            answer = Math.max(answer, count);
        }
        
        
        return answer;
    }
}

class BookTime implements Comparable<BookTime> {
    private int startMin;
    private int endMin;
    
    public BookTime(int sm, int em) {
        this.startMin = sm;
        this.endMin = em;
    }
    
    public int getStartMin() {
        return startMin;
    };
    
    public int getEndMin() {
        return endMin;
    }
    
    @Override
    public int compareTo(BookTime bookTime) {
        return this.startMin - bookTime.startMin;
    }
}
Comments