[백준/Python] 20006 랭킹전 대기열
특별한 알고리즘 없이 써있는 대로 구현하는 문제이다.
고려해야할 부분은 두 가지라고 생각하는데
1. 입력된 순서대로 게임을 시작한다 → for문으로 입력으로 차례로 받아서 바로바로 방에 넣어줘야함
2. 닉네임은 사전 순으로 출력된다 → 마지막에 sorting 해주기
1번 때문에 모든 입력을 한 번에 받은 후 레벨을 기준으로 정렬해 m명 씩 나눠 출력할 수 없다는 뜻이다.
그렇다면 어떻게 문제를 간단히 생각할 수 있을까?
핵심 아이디어는 다음과 같다.
처음 방에 들어간 사람의 레벨과 비교해 -10 <= <= +10 이 아닐 때 새로운 방을 만들고,
아니면 m명이 되기 전까지 인원을 추가 시킨다
인원을 추가하고, 새로운 방을 만드는 것을 하려면 list 형식이 좋을 것이라고 생각했다.
한 방에는 m명의 사용자의 닉네임과 레벨 정보를 모두 가지고 있는 리스트를 갖도록 생각했다.
[ [ ['a', 10], ['b', 25], ··· ], [ ['d', 30], ['h', 26], ··· ], ··· ]
def compareLv(n, l):
roomIn = 0 # 이미 존재하는 방에 들어갔는지 확인
for gr in gameRoom:
if gr[0][1] - 10 <= l <= gr[0][1] + 10 and len(gr) < m:
gr.append([n, l])
roomIn = 1
break
# 이미 존재하는 방에 들어가지 못했다면 새로운 방 만듦 -> append할 때 [[]]로 만듦
if roomIn == 0:
gameRoom.append([[n, l]])
p, m = map(int, input().split())
gameRoom = []
for _ in range(p):
l, n = input().split()
l = int(l)
compareLv(n, l)
# 닉네임 기준으로 정렬 후 각 방 별로 출력
for gr in gameRoom:
gr = sorted(gr)
if len(gr) == m:
print('Started!')
else:
print('Waiting!')
for n, l in gr:
print(l, n)
풀이과정
1. 각 사용자의 레벨과, 닉네임을 입력 받은 후 compareLv 함수에 넣음
2. compreLv 함수는 현재 사용자가 이미 존재하는 방에 들어갈 수 있는지, 없는지를 판단해 사용자를 입장시키는 함수
2-1. 각 방에 처음 입장한 사용자의 레벨과 비교해 -10 ~ +10 이고, 해당 방에 m 미만의 사용자가 있다면 사용자를 입장
2-2. 조건에 만족하지 못하면, 새로운 방을 만들어 사용자를 입장
3. gameRoom 리스트의 각 방에 있는 사용자들을 닉네임을 기준으로 정렬시킨 후,
3-1. 한 방씩 'Started!' 또는 'Waiting!' 을 출력 후 사용자의 '레벨 닉네임' 출력