종운이는 운영하던 게임에 랭킹전 기능을 추가하려고 한다. 플레이어 간의 실력차이가 있을 수 있기 때문에 입장을 신청하면 자신과 비슷한 레벨의 플레이어들을 매칭하여 게임을 시작하게 하려고 한다.
플레이어 간 매칭을 해주는 시스템은 다음과 같다.
플레이어가 입장을 신청하였을 때 매칭이 가능한 방이 없다면 새로운 방을 생성하고 입장시킨다. 1. 이떄 해당 방에는 처음 입장한 플레이어의 레벨을 기준으로 -10부터 +10까지 입장 가능하다.
2. 입장 가능한 방이 있다면 입장시킨 후 방의 정원이 모두 찰 때까지 대기시킨다.
2-1. 이때 입장이 가능한 방이 여러 개라면 먼저 생성된 방에 입장한다.
3. 방의 정원이 모두 차면 게임을 시작시킨다.
플레이어의 수 p, 플레이어의 닉네임 n, 플레이어의 레벨 l, 방 한개의 정원 m이 주어졌을 때 위와 같은 방법으로 매칭해주고 최종적으로 만들어진 방의 상태와 입장 플레이어들을 출력하는 프로그램을 작성하자.
사실 접근 방법이랄 것 까지는 없다.
문제에서 주어진 조건을 차례대로 코드에 접목시키면 해결이 충분히 가능하다.
나는 아래와 같이 접근했다.
1. 플레이어 정보를 순서대로 받으면서 판단한다.
2. 만일 맨 처음 플레이어이면 방을 새로 파서 넣어준다.
3. 이후 플레이어는 각 방의 첫번째 플레이어 기준으로 레벨 -10, +10과 정원 수 조건을 판별하여 만족하면 해당 방에, 아니면 새로운 방에 넣어준다.
4. 모두 만들어진 방을 이름 기준으로 정렬을 했다.
5. 정원이 찬 방은 Started!와 함께, 아닌 방은 Waiting!과 함께 출력해줬다.
P, M = map(int,input().split())
rooms = []
# 각각의 플레이어를 입력 받아 방에 넣어주기
for p in range(P):
l, n = input().split()
# 최초 입력된 플레이어
if not rooms:
rooms.append([[int(l),n]])
continue
# 방에 들어갔는지 확인 하는 flag변수
enter = False
# 각 방을 돌면서
for room in rooms:
# 조건에 합당하면 넣어주기
if len(room) < M and room[0][0] - 10 <= int(l) <= room[0][0] + 10:
room.append([int(l),n])
enter = True
break
# 못들어갔으면 새로운 방을 파서 넣어주기
if not enter:
rooms.append([[int(l),n]])
# 이름 기준 정렬
for room in rooms:
room.sort(key=lambda x:x[1])
# 정원 수에 따라 출력
for room in rooms:
if len(room) == M:
print('Started!')
else:
print('Waiting!')
for lv, name in room:
print(lv, name)