본문 바로가기
프로그래머스/Python

[프로그래머스] 호텔 대실 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 11. 15.
728x90
반응형

 

프로그래머스

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

programmers.co.kr

 

1. 문제 설명

2. 풀이과정

해당 문제는 호텔 예약의 입실 시각, 퇴실 시각을 기준으로 최소한의 방을 사용하는 문제이다.
우선 입실 시각을 기준으로 정렬하고 입실 시각이 우선인 예약부터 방을 배정한다.
방은 00:00부터 23:59까지 예약이 가능하므로 예약 가능 시각을 모두 분으로 변경하여 각 분을 한 칸으로 지정해 예약 가능한지 판별한다.
방 하나를 가지고 모든 예약 시각을 불러오며 최대한의 예약을 채우고, 방을 예약하면 예약 시각에서 제거하고 예약 시각이 비워질 때까지 반복한다.

  1. 예약 시각을 deque 자료구조로 만들기 위해 deque 함수를 불러온다. from collections import deque
  2. 예약 시각을 입실 시각이 앞인 순서대로 정렬하려고 한다. 우선 입실 시각의 분을 기준으로 오름차순 정렬을 한다. book_time.sort(key = lambda x : int(x[0][3:]))
  3. 그다음 예약 시각을 입실 시각의 시를 기준으로 다시 오름차순 정렬을 한다. book_time.sort(key = lambda x : int(x[0][:2]))
  4. 정렬한 예약 시각을 리스트에서 deque 자료구조로 변경한다. book_time = deque(book_time)
  5. 예약 시각을 모두 방 배정할 때까지 반복하며 while (book_time)
  6. 한 방이 예약받을 수 있는 총 분을 각 칸으로 하는 리스트를 생성한다. room = list(True for _ in range(1440))
  7. 예약 시각의 개수만큼 반복하며 for _ in range(len(book_time))
  8. 방을 배정할 예약을 불러온다. book = book_time.popleft()
  9. 입실 시각을 분으로 변환한다. s = int(book[0][:2]) * 60 + int(book[0][3:])
  10. 퇴실 시각을 분으로 변환한다. e = int(book[1][:2]) * 60 + int(book[1][3:])
  11. 만약 해당 예약 시각에 현재 방을 사용할 수 있으면 if (False not in room[s : e])
  12. 예약 시각의 분을 예약 불가로 바꾼다. for i in range(s, e): room[i] = False
  13. 이후 만약 예약 시각의 퇴실 시각에 10분(청소시간)을 더했을 때 23:59 안에 있으면 if (e + 10 < len(room))
  14. 청소 시간도 예약 불가로 표시한다. for i in range(e, e + 10): room[i] = False
  15. 반면 현재 방에 예약이 불가능하면 예약을 다시 예약 시각에 넣는다. else: book_time.append(book)
  16. 한 방에 대한 예약을 마치면 방 개수를 늘린다. answer += 1

반응형

3. 소스코드

from collections import deque

def solution(book_time):
    answer = 0
    
    book_time.sort(key = lambda x : int(x[0][3:]))
    book_time.sort(key = lambda x : int(x[0][:2]))
    book_time = deque(book_time)

    while (book_time):
        room = list(True for _ in range(1440))
        for _ in range(len(book_time)):
            book = book_time.popleft()
            s = int(book[0][:2]) * 60 + int(book[0][3:])
            e = int(book[1][:2]) * 60 + int(book[1][3:])
            if (False not in room[s : e]):
                for i in range(s, e):
                    room[i] = False
                if (e + 10 < len(room)):
                     for i in range(e, e + 10):
                            room[i] = False
                            
            else:
                book_time.append(book)

        answer += 1

    return answer
728x90
반응형