- 문제 : 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])
'백준 > 구현' 카테고리의 다른 글
[구현/백준] 20055번 : 컨베이어 벨트 (0) | 2023.09.12 |
---|---|
[구현/백준] 14503번 : 로봇 청소기 (0) | 2023.09.11 |
[구현/백준] 1138번 : 한 줄로 서기 (0) | 2023.09.06 |
[구현/백준] 2952번 : NBA 농구 (0) | 2023.09.03 |
[구현/백준] 1205번 : 등수 구하기 (0) | 2023.08.29 |