프로그래머스/Lv.2

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

KimNang 2024. 1. 19. 11:30

문제 정보

제목 : 호텔 대실

난이도 : Lv.2

사용 언어 : Python

문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

문제 설명

호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 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_time result
[["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개의 방이 필요합니다.


나의 풀이

청소시간을 계산 해야하기때문에 문자열 형태는 불편함이 있어서 숫자형으로 값을 변경하여 booKList라는 리스트에 저장후 입실 시간이 빠른 순으로 정렬합니다. 그다음 bookList를 순차적으로 접근하는 for 루프를 이용해서 여러 조건을 비교하며 계산합니다. 사용중인 객실이 하나도 없으면 바로 객실을 할당합니다. 만약 다음 손님의 입실 시간이 퇴실 시간+청소 시간 이후라면 그 방에 할당하고, 아니라면 다른 객실에 입실해야하므로 answer에 1을 추가합니다. 

 

코드

from heapq import heappop, heappush

def solution(book_time):
    answer = 1
    roomList = []
    bookList = []
    
    # 분단위의 숫자형으로 값 변경하고 시작 시간 기준으로 정렬
    for start,end in book_time:
        start = start.split(":")
        start = int(start[0])*60 + int(start[1])
        end = end.split(":")
        end = int(end[0])*60 + int(end[1])
        bookList.append([start,end])
    bookList.sort()

    # 호텔 객실 할당함
    for start,end in bookList:
        if not roomList :
            heappush(roomList,end)
            continue
        if( roomList[0] <= start) :
            heappop(roomList)
        else :
            answer+= 1
        heappush(roomList,end+10)
    return answer