47 lines
1.9 KiB
Python
47 lines
1.9 KiB
Python
# 랭킹전 대기열
|
|
|
|
import sys
|
|
|
|
input = sys.stdin.readline
|
|
|
|
def solution():
|
|
p, m = map(int, input().rstrip().split())
|
|
|
|
room = {}
|
|
for i in range(p):
|
|
l, n = input().rstrip().split()
|
|
l = int(l)
|
|
for j in room:
|
|
if len(room[j]) < m and l >= j[0]-10 and l <= j[0]+10:
|
|
room[j].append((l, n))
|
|
break
|
|
else:
|
|
room[(l, n)] = [(l, n)]
|
|
|
|
for v in room.values():
|
|
if len(v) == m:
|
|
print("Started!")
|
|
else:
|
|
print("Waiting!")
|
|
for j in sorted(v, key=lambda x: x[1]):
|
|
print(*j)
|
|
|
|
return
|
|
|
|
|
|
solution()
|
|
|
|
"""
|
|
걸린 시간: 50분
|
|
|
|
시간 복잡도: p개의 플레이어를 방에 분배하기 위해 각 방을 확인해보는 시간 복잡도도 균등분배 기준으로 p//m개 방이므로, O(p* p//m) = O(p^2*m)이다.
|
|
room.values()를 확인하며 정렬하고 출력하는 것은 p//m 즉 균등분배 가정으로 나올 수 있는 최대 방 개수만큼 정렬하기 때문에
|
|
O(mlogm * p//m)이므로 O(plogm)이다.
|
|
따라서 전체 시간 복잡도는 O(p^2*m)이다.
|
|
p, m <= 300이기 때문에 그냥했지만 크기가 커진다면 모르기 때문에 들어갈 방을 범위로 나타내서 이분탐색을 하면 줄일 수 있다.
|
|
물론 방이 다 차면 같은 범위를 가지는 방이 또 필요할 수 있기 때문에 적절히 조치를 취해야한다.
|
|
|
|
해설: p개의 플레이어를 확인하면서 맞는 room이 있다면 넣고, 없다면 room을 만든다. 이때, 딕셔너리를 사용했는데 level만 키로 쓰면 중복될 수 있으므로,
|
|
(level, name)을 키로 써서 해야한다. 플레이어마다 생성된 room을 순서대로 다 범위를 확인한다. (이분 탐색을 쓰면 더 좋겠다.)
|
|
다 room에 넣은 후 room 길이에 따라 started와 waiting을 쓰고, 이름 순으로 정렬한 뒤 출력한다.
|
|
""" |