[Silver IV] 참가자 명단 - 23056
성능 요약
메모리: 108384 KB, 시간: 100 ms
분류
구현, 정렬
제출 일자
2026년 04월 25일 22:04:59
문제 설명
백남이의 모교인 백준고등학교에서 체육대회를 개최하려 한다.
백남이는 학생들의 체육대회 신청을 관리하게 되었다.
체육대회는 1부터 $N$까지의 학급만 참여하며, 각 학급당 최대 $M$명까지 선착순으로 참가할 수 있다. 단, $N$은 짝수이다.
또한, 체육대회의 팀을 학급이 홀수일 때 청팀, 짝수일 때 백팀으로 나누기로 했다.
이에 따라 백남이는 체육대회 참가자 명단 프로그램을 제작하려 한다.
- 청팀을 먼저, 백팀을 나중에 출력한다.
- 각각의 팀에 대해 학급을 오름차순으로 출력한다.
- 각각의 학급에 대해 학생의 이름을 길이가 짧은 것부터, 길이가 같다면 사전 순으로 출력한다.
입력
첫째 줄에 학급 수인 $N$과 학급당 신청 가능한 인원수 $M$이 주어진다. ($N$은 짝수이고 $2\leq N \leq 10$, $1\leq M \leq 10$)
둘째 줄부터 신청된 순서대로 학생의 학급과 이름이 주어진다. 학생의 학급은 $N$을 초과하지 않는다. 이름은 모두 소문자이며 15자를 초과하지 않는다.
학급과 이름이 동일한 학생은 존재하지 않는다.
신청할 수 있는 최대 학생 수는 500명이다.
입력의 마지막은 0 0으로 나타낸다.
출력
첫째 줄부터 백남이의 체육대회 참가자 명단 프로그램에 맞게 학생의 학급과 이름을 공백으로 구분하여 출력한다.
💡 해결 방법
💻 코드
# https://www.acmicpc.net/problem/23056
from sys import stdin
input = stdin.readline
n, m = map(int, input().split())
stus = dict()
for i in range(1, n+1):
stus[i] = []
while True:
x, y = input().split()
x = int(x)
if x == 0 and int(y) == 0:
break
else:
if len(stus[x]) < m:
stus[x].append(y)
for x in range(1, n + 1, 2):
stus[x].sort(key = lambda k : [len(k), k])
for x2 in stus[x]:
print(x, x2)
for x in range(2, n+2, 2):
stus[x].sort(key = lambda k : [len(k), k])
for x2 in stus[x]:
print(x, x2)