[Programmers] P64063 호텔방 배정
[Programmers] P64063 호텔방 배정
Question
Language: Python
해당 문제는 전형적인 scheduling 유형의 문제이다. 주어진 시간/deadline에 대해서 처리를 할 수 없는데, 다음 deadline에 대해서 할당해주는 작업을 해줘야한다.
즉 1번 자리에 작업을 할당하고 나면 1번은 그 다음 시간인 2번과 연결시켜서, 1번으로의 작업이 요청되었을 때, 2번으로 자동 처리될 수 있도록 한다.
minimal_disjoint sets
def find_parent_compressed(parents,x):
if parents[x]==0:
return x
if x!=parents[x]:
parents[x]=find_parent_compressed(parents,parents[x])
return parents[x]
def union_parents(parents,x,y):
pre_x=find_parent_compressed(parents,x)
pre_y=find_parent_compressed(parents,y)
if pre_x < pre_y:
parents[pre_x]=pre_y
else:
parents[pre_y]=pre_x
주의점
해당 문제 풀이 할때, 주의할 점이 있는데, 바로 K값이 매우 크기 때문에 단순히 parents 배열을 K 만큼 할당하게 되면, 메모리 초과 및 시간 초과가 발생할 수 있다.
따라서, dictionary를 통해 필요한 parents에 대해서만 이를 저장할 수 있도록 한다.
위 문제의 경우, 최대 20만개의 원소만 관리하면 된다.
Solution
from collections import defaultdict
import sys
def find_parent_compressed(parents,x):
if parents[x]==0:
return x
if x!=parents[x]:
parents[x]=find_parent_compressed(parents,parents[x])
return parents[x]
def union_parents(parents,x,y):
pre_x=find_parent_compressed(parents,x)
pre_y=find_parent_compressed(parents,y)
if pre_x < pre_y:
parents[pre_x]=pre_y
else:
parents[pre_y]=pre_x
def solution(k, room_number):
sys.setrecursionlimit(10**4)
answer = []
parents=defaultdict(int)
for number in room_number:
parent=find_parent_compressed(parents,number)
answer.append(parent)
union_parents(parents,parent,parent+1)
return answer
댓글남기기