- 문제 : https://www.acmicpc.net/problem/20006

 

문제 이해 

- 처음에 player명의 플레이어들이 들어와서 방에 참여하거나 방을 만드는 게임이다 

- 각 방에는 참여인원이 member로 제한되고, 참여도 처음 들어간 사람의 레벨이 기준이 되어 그 레벨에서 -10에서 +10 인 레벨만 입장이    가능하다. 

- 만약 들어갈 수 있는 방이 없다면 새로 방을 만든다. 

- 이렇게 각 플레이어에 대해 방 입장을 다 시켰으면 각 방 별로 member의 수만큼 있는 곳은 Started!를 출력하고, 그 방에 있는 플레이어의 레벨과 닉네임을 닉네임을 오름차순으로 한 뒤 출력한다. 

- 만약 방의 인원수가 member 보다 작다면 Waiting!을 출력하고, 각 방에 있는 플레이어의 레벨과 닉네임을 닉네임을 오름차순으로해서 출력하면 된다. 

 

- 이 문제에서 생각을 좀 해야했던 부분은 각 방에 들어가는 조건이 인원수와 기준레벨로 두 가지였다는 것과 마지막에 방에 있는 플레이어    의 레벨과 닉네임을 출력하는 것이었다. 

  그러면 각 정보를 모두 배열에 넣었어야 했기에 배열 answer를 다음과 같이 설정했다. 

  만들어진 방 순서대로 들어간다는 조건도 있었는데, 이는 순서대로 방을 생성한 뒤 방을 왼쪽부터 순차대로 진행하면 된다. 

(인덱스 -> 방 번호), [인원수, 기준 레벨, [레벨, 닉네임]]

- answer에 들어가는 각 방 정보를 다음과 같이 한 다음에 각 인원수와 기준 레벨로 방 참여 여부를 결정하고, 그렇지 않다면 새로 방을 만    들어 주면 된다. 

 

정답 풀이 

import sys
input = sys.stdin.readline

players, member = map(int, input().split())

answer = [] # 방이 생성되어서 들어감 (인덱스 -> 방 번호), [인원수, 기준 레벨, [레벨, 닉네임]]
for i in range(players):
    level, nickname = input().split()
    level = int(level)
    flag = False
    
    for j in range(len(answer)):
        if answer[j][0] < member: 
            if answer[j][1] - 10 <= level <= answer[j][1] + 10:
                answer[j].append([level, nickname])
                answer[j][0] += 1
                flag = True
                break
    if not flag: # 기존에 있는 방에 못 들어감
        answer.append([1, level, [level, nickname]])
        
for i in range(len(answer)):
    if answer[i][0] == member :
        print('Started!')
        result = sorted(answer[i][2:], key = lambda x : x[1])
        for j in range(member):
            print(result[j][0], result[j][1])
    else: 
        print('Waiting!')
        result = sorted(answer[i][2:], key = lambda x : x[1])
        for j in range(answer[i][0]):
            print(result[j][0], result[j][1])

+ Recent posts