[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)