우당탕탕 개발일지

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

코테/프로그래머스

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

ujin302 2024. 5. 7. 15:31
반응형

문제

한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있습니다.
예약 시각이 문자열 형태로 담긴 2차원 배열 book_time이 매개변수로 주어집니다. 

최소 객실의 수를 return 하는 solution 함수를 완성해주세요.

 

입출력 예

 

풀이

[ 풀이 내용 ]

1. 시간은 분단위
2. String 배열 : 체크인 시간 기준 오름차순 정렬
3. 우선순위 큐 : 체크아웃 시간 + 청소(10분) 기준 오름차순 정렬
    >> 우선순위 큐에는 현재 방을 사용중인 예약에 대한 정보를 가지고 있음
    >>  즉, 큐의 크기는 최소한의 방 개수를 의미함.

4. 현재 예약 체크아웃 시간(방을 사용하고 있는 예약) <= 다음 예약 체크인 시간 (현재 방을 사용하고 있지 않은 예약)
     >> 해당 경우, 체크아웃 시간이 되었기에 큐에서 현재 예약 제거
     >> 그 후, 다음 예약이 방금 체크아웃한 방을 사용하기에 큐에 저장

5. 4번의 경우가 아닐 경우 그냥 큐에 저장
     >> 새로운 방 부여

 

6. 큐의 크기 반환 

     >> 큐의 크기 == 사용하는 최소한의  방 개수 


 

1. 시간은 분단위 

 

 

 

2, 3 String 배열 & 우선순위 큐 

 

 

4, 5 체크아웃 시간 확인 

 

For문 

1. 체크인 시간 기준으로 오름차순 정렬되어 있는 배열의 원소을 차례대로 가져오기 

>> 시간대로 체크인 해야하는 예약

 

2. 현재 체크인 해야하는 예약을 분단위로 변경

3. 큐에 값 존재 확인 

>> 큐에 값이 있다면 현재 사용중인 방이 있다고 판단 

 

4. 현재 사용하고 있는 방의 체크아웃 시간 확인 

현재 사용하고 있는 방의 체크아웃 시간 <= 새로운 예약의 체크인 시간 

4-1. 3,4번 모두 만족하면 현재 사용하고 있는 방이 체크아웃하여 새로운 예약을 받을 상태가 되었다고 판단 

따라서 체크아웃을 위해 큐에서 첫번째 요소 삭제 

 

5. 큐에 새로운 예약 추가 

3,4번에 해당한다면 해당 방에 새로운 예약을 넣는것을 의미함.

그렇지 않을 경우, 새로운 방을 제공한다는 것을 의미함. 

 

6. 큐 크기 반환 

위의 for문을 통해서 큐에는 방을 사용하고 있는 예약정보를 담고 있음. 

따라서 큐의 크기는 최소한의 방 개수를 의미함. 

 

 

코드

public int s3_1(String[][] book_time) {
        // 1. 체크인 시간 기준 오름차순 정렬
        Arrays.sort(book_time, (o1, o2) -> toSec(o1[0]) - toSec(o2[0]));

        // 2. 우선순위 큐 >> 체크아웃 시간 기준으로 오름차순 정렬
        // >> 현재 방을 사용하고 있는 예약 저장
        PriorityQueue<int[]> book_CheckOut = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);

        for (String[] bookStr : book_time) {
            int[] book = new int[2];
            book[0] = toSec(bookStr[0]); // 체크인
            book[1] = toSec(bookStr[1]) + 10; // 체크아웃

            if (!book_CheckOut.isEmpty()) { // 현재 방을 사용중인 예약 존재
                if (book_CheckOut.peek()[1] <= book[0]) {
                    // 현재 사용중인 방의 체크아웃 시간 <= 새로운 에약의 체크인 시간
                    book_CheckOut.poll(); // 체크아웃 시간으로 간주하여 큐에서 제거
                }
            }
            // 새로운 예약 큐에 저장
            book_CheckOut.add(book);
        }

        return book_CheckOut.size();
    }

 

 

프로그래머스 문제

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

 

프로그래머스

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

programmers.co.kr

 

반응형