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

김멉덥·2023년 8월 30일
0

알고리즘 공부

목록 보기
98/171
post-thumbnail
post-custom-banner

문제

프로그래머스 연습문제


코드 구현

def solution(book_time):
    answer = 0

    ans = []
    book_time = sorted(book_time)       # 대실 시작 시간이 이른것부터 정렬

    for i in range(len(book_time)):
        room = []
        # 비어있는 시간이라면 -> 이미 다른 방으로 예약됨 (넘어가기)
        if (len(book_time[i]) == 0):
            continue

        room.append(book_time[i])       # book_time[i] 삽입
        end_time = book_time[i][1].split(":")                               # book_time[i]의 퇴실 시간 구하기
        end_time_min = (int(end_time[0]) * 60) + int(end_time[1]) + 10      # 퇴실 시간을 분 기준으로 변환하고 청소시간 10분을 더해두기

        for j in range(i + 1, len(book_time)):          # 다음 시간대의 방이 바로 이 방에 예약될 수 있는지 따져보기
            # 비어있는 시간이라면 -> 이미 다른 방으로 예약됨 (넘어가기)
            if(len(book_time[j]) == 0):
                continue

            next_start_time = book_time[j][0].split(":")        # book_time[j]의 입실 시간 구하기
            next_start_time_min = (int(next_start_time[0]) * 60) + int(next_start_time[1])      # 입실 시간을 분 기준으로 변환

            if (end_time_min <= next_start_time_min):   # i번째 시간의 퇴실 시간 + 청소시간 이어도 입실 가능한 시간이라면
                room.append(book_time[j])       # 바로 그 방의 다음 손님으로 입실

                # 그 다음 방이 연속으로 입실할 수 있는지 따지기 위해 새로운 퇴실시간을 j번째 요소로 갱신
                new_end_time = book_time[j][1].split(":")
                end_time_min = (int(new_end_time[0]) * 60) + int(new_end_time[1]) + 10
                book_time[j] = []       # 이미 방이 지정되었으므로 비우기

        ans.append(room)

    print(ans)
    answer = len(ans)

    return answer

풀이

  • 정렬 후 순서대로 방 시간대의 퇴실 시간 + 청소시간과 그 다음 시간대의 입실 시간을 비교해가며 만약 퇴실 + 청소 시간 후 바로 입실할 수 있는 시간의 방이라면 그 방에 배정 (room 배열에 추가), 아니라면 다른 방으로 배정
  • 연속적으로 검사하기 위해서는 그 다음 방의 퇴실시간을 초기화하기 전에 비교를 위해 업데이트 해주어야함 → 이 부분에서 조금 해맸다.
    • 활용한 예제 )
      [["09:10", "10:10"], ["10:20", "12:20"], ["12:30", "13:20"]]
      >>> answer : 1

profile
데굴데굴 뚝딱뚝딱 개발기록
post-custom-banner

0개의 댓글