Files
baekjoon-study/workbook_8708/silver/20006-s2.py
2026-02-23 11:14:50 +09:00

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을 쓰고, 이름 순으로 정렬한 뒤 출력한다.
"""