프로그래머스 - 호텔 방 배정
k
개 방이 있는 호텔에 투숙하려는 고객들에게 방을 배정하려고 한다.
각 방은 1 ~ k
번까지 번호로 구분되어있고, 처음에는 모든 방이 비어있다.
다음 규칙에 따라 고객에게 방을 배정한다.
Node
로 만든다. 방의 최대 갯수는 10^12개 이므로 미리 만들지 않고 실제 사용할때 만든다.Node
들이 가리키는 다른 Node
는 현재 방이 차 있을 경우, 배정될 다른 방을 의미한다.Node
들은 자기 자신을 가리키고 있다.n Node
방에 배정이 된다면 n+1 Node
방이 가리키고 있는 Node
를 가리킨다..n Node
방을 다시 요청할 경우, n Node
이 가리키는 방을 찾아 배정한 후 2번과정을 다시 반복한다.그림으로 표현하면 다음과 같다.
dict
자료구조를 이용한다.key
값은 방 번호, value
값은 가리키는 방 번호를 의미하도록 한다.answer
에 현재 방을 추가하고, 현재 방 번호를 반환한다.import sys
from collections import defaultdict
sys.setrecursionlimit(10**6) # 재귀가 너무 깊게 시행될 경우 효율성 체크에서 런타임 에러가 뜰 수있다.
def solution(k, room_number):
answer = []
info = defaultdict(int) # 새로운 key를 사용할 때, 기본값 int를 사용하는 값을 만들어준다.
def find_nxtroom(num: int) -> int:
if info[num] == 0: # 기본값일 경우 재귀를 종료한다.
answer.append(num)
info[num] = num + 1
# 다음 방을 지정해준다.
# 이때에는 num + 1번방이 다른 방을 가리키고 있는지는 알지 못하지만
# 다음에 현재 방보다 작은 번호를 요청할 경우 값이 갱신될 것이다.
return num + 1
info[num] = find_nxtroom(info[num])
return info[num]
for i, r in enumerate(room_number):
find_nxtroom(r)
return answer