백준 20006. 랭킹전 대기열 (Python)

하얀족제비·2021년 6월 19일
0

백준

목록 보기
5/18
post-thumbnail

문제

종운이는 운영하던 게임에 랭킹전 기능을 추가하려고 한다. 플레이어 간의 실력차이가 있을 수 있기 때문에 입장을 신청하면 자신과 비슷한 레벨의 플레이어들을 매칭하여 게임을 시작하게 하려고 한다.

플레이어 간 매칭을 해주는 시스템은 다음과 같다.

플레이어가 입장을 신청하였을 때 매칭이 가능한 방이 없다면 새로운 방을 생성하고 입장시킨다. 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)
profile
안녕하세요~ 개발을 꿈꾸는 하얀족제비입니다!

0개의 댓글