[알고리즘] Programmers 호텔 대실 #Python

김상현·2023년 2월 3일
0

알고리즘

목록 보기
275/301
post-thumbnail

[Programmers] 호텔 대실 바로가기

📍 문제 설명

호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있습니다.
예약 시각이 문자열 형태로 담긴 2차원 배열 book_time 이 매개변수로 주어질 때, 코니에게 필요한 최소 객실의 수를 return 하는 solution 함수를 완성해주세요.


📍 제한 사항

  • 1 ≤ book_time의 길이 ≤ 1,000
    • book_time[i]는 ["HH:MM", "HH:MM"]의 형태로 이루어진 배열입니다
      • [대실 시작 시각, 대실 종료 시각] 형태입니다.
    • 시각은 HH:MM 형태로 24시간 표기법을 따르며, "00:00" 부터 "23:59" 까지로 주어집니다.
      • 예약 시각이 자정을 넘어가는 경우는 없습니다.
      • 시작 시각은 항상 종료 시각보다 빠릅니다.

📍 입출력 예

book_timeresult
[["15:00", "17:00"], ["16:40", "18:20"], ["14:20", "15:20"], ["14:10", "19:20"], ["18:20", "21:20"]]3
[["09:10", "10:10"], ["10:20", "12:20"]]1
[["10:20", "12:30"], ["10:20", "12:30"], ["10:20", "12:30"]]3

📍 입출력 예 설명

입출력 예 #1

위 사진과 같습니다.

입출력 예 #2

첫 번째 손님이 10시 10분에 퇴실 후 10분간 청소한 뒤 두 번째 손님이 10시 20분에 입실하여 사용할 수 있으므로 방은 1개만 필요합니다.

입출력 예 #3

세 손님 모두 동일한 시간대를 예약했기 때문에 3개의 방이 필요합니다.


📍 문제 풀이

📌 풀이 과정

객실은 손님에게 할당한다. 할당하는 방법은 다음과 같다.

  • 만약 입장하는 손님의 입장 시간이 앞서 입장한 객실의 손님의 퇴장시간 이후라면 해당 객실을 할당한다.
    • 할당할 객실의 선택 기준은 퇴장 시간이 가장 빠른 객실을 기준으로 한다.
  • 만약 입장하는 손님의 입장 시간이 앞서 입장한 객실의 손님의 퇴장시간 이전이라면 새로운 객실을 할당한다.

🧷 1. 예약시간 정렬

book_time_ref = [(int(s[:2]) * 60 + int(s[3:]), int(e[:2]) * 60 + int(e[3:])) for s, e in book_time]
book_time_ref.sort()
  • 만약 대실 시작 시각, 대실 종료 시각이 ["14:10", "19:20"] 로 주어진다면 분단위의 숫자형으로 값을 변경해준다.
    • "14:10"14 * 60 + 10 = 850
    • "19:20"19 * 60 + 20 = 1160
  • 분단위로 변경된 예약 시간을 대실 시작 시각을 기준으로 정렬한다.

🧷 2. 객실 할당

heap = []
for s, e in book_time_ref:
    if not heap:
        heappush(heap,e+10)
        continue
    if heap[0] <= s:
        heappop(heap)
    else:
        answer += 1
    heappush(heap,e+10)
  • 대실 시작 시각(s)을 기준으로 정렬된 예약 시간을 통해 객실을 할당한다.
    • 만약 현재 할당한 객실이 존재하지 않는다면 바로 객실을 할당한다.
    • 만약 현재 객실 중 가장 빠른 대실 종료 시각(heap[0])이 현재 대실 시작 시각(s)보다 같거나 빠르다면 해당 객실을 현재 손님에게 할당한다.
    • 반대로 현재 객실 중 가장 빠른 대실 종료 시각(heap[0])이 현재 대실 시작 시각(s)보다 느리다면 새로운 객실(answer)을 추가한다.

✍ 코드

from heapq import heappop, heappush

def solution(book_time):
    answer = 1
    
    # "HH:MM" → HH * 60 + MM
    book_time_ref = [(int(s[:2]) * 60 + int(s[3:]), int(e[:2]) * 60 + int(e[3:])) for s, e in book_time]
    book_time_ref.sort()
    
    heap = []
    for s, e in book_time_ref:
        if not heap:
            heappush(heap,e+10)
            continue
        if heap[0] <= s:
            heappop(heap)
        else:
            answer += 1
        heappush(heap,e+10)
    
    return answer
profile
목적 있는 글쓰기

4개의 댓글

comment-user-thumbnail
2023년 12월 6일

안녕하세요. 해당 문제 풀이 과정을 찾다가 들렸습니다.
힙을 쓸 생각을 못 해서 정답은 맞췄지만 시간이 느렸는데 덕분에 더 효율적인 코드를 찾을 수 있었습니다. ㅎㅎ
그치만 코드에서 오류를 발견했습니다. heap 리스트가 비워있다면 e 값을 push 하는데 이 경우에도 e+10 을 push 하는 것이 맞는 것 같아 댓글 남깁니다!
좋은 풀이 감사합니다.

1개의 답글
comment-user-thumbnail
2024년 8월 9일

Whether you're a substance maker, a specialist, or simply hoping to upgrade your own recordings, VN Video Manager offers a strong and natural stage to rejuvenate your dreams. With its easy to understand interface, high level altering highlights, and many impacts and advances, you can easily create proficient quality recordings right from your PC https://vneditorforpc.com/

답글 달기
comment-user-thumbnail
2024년 8월 9일

Welcome to Cricfy television, your final location for everything cricket! Whether you're a devoted fan or simply getting into the game, Cricfy television offers complete inclusion, master examination, and live reports on matches from around the world. https://cricfy.live/

Welcome to Suyu Emulator, the state of the art answer for consistent gaming on your PC. Intended to bring your number one versatile games and applications to a bigger screen, Suyu Emulator offers smooth execution and upgraded illustrations, making your gaming experience more vivid and charming. https://suyuemulator.net/

답글 달기