반응형

@notepad_jj2

츄르사려고 코딩하는 코집사입니다.


1. [백준 알고리즘] 백준 23054번 참가자 명단 파이썬(Python)

1) 문제번호 : 23056번

 

2) 문제 출처

https://www.acmicpc.net/problem/23056

 

23056번: 참가자 명단

첫째 줄에 학급 수인 $N$과 학급당 신청 가능한 인원수 $M$이 주어진다. ($N$은 짝수이고 $2\leq N \leq 10$, $1\leq M \leq 10$) 둘째 줄부터 신청된 순서대로 학생의 학급과 이름이 주어진다. 학생의 학급은

www.acmicpc.net

 

2. 문제

 

백남이의 모교인 백준고등학교에서 체육대회를 개최하려 한다.

백남이는 학생들의 체육대회 신청을 관리하게 되었다.

체육대회는 1부터 N까지의 학급만 참여하며, 각 학급당 최대 M명까지 선착순으로 참가할 수 있다. 단, N은 짝수이다.

또한, 체육대회의 팀을 학급이 홀수일 때 청팀, 짝수일 때 백팀으로 나누기로 했다.

이에 따라 백남이는 체육대회 참가자 명단 프로그램을 제작하려 한다.

  • 청팀을 먼저, 백팀을 나중에 출력한다.
  • 각각의 팀에 대해 학급을 오름차순으로 출력한다.
  • 각각의 학급에 대해 학생의 이름을 길이가 짧은 것부터, 길이가 같다면 사전 순으로 출력한다.

 

3. 제약사항

 

4. 입력

첫째 줄에 학급 수인 N과 학급당 신청 가능한 인원수 M이 주어진다. (N은 짝수이고 2≤N≤10, 1≤M≤10)

둘째 줄부터 신청된 순서대로 학생의 학급과 이름이 주어진다. 학생의 학급은 N을 초과하지 않는다. 이름은 모두 소문자이며 15자를 초과하지 않는다.

학급과 이름이 동일한 학생은 존재하지 않는다.

신청할 수 있는 최대 학생 수는 500명이다.

입력의 마지막은 0 0으로 나타낸다.

 

 

5. 출력

첫째 줄부터 백남이의 체육대회 참가자 명단 프로그램에 맞게 학생의 학급과 이름을 공백으로 구분하여 출력한다.

 

6. 풀이

- 청팀과 백팀의 리스트를 나눠서 입력을 받고, 학급당 신청 가능한 인원 수를 체크하기 위한 리스트를 만들었다.

- 그래서, 학급당 신청 가능 수가 M보다 작으면 입력을 받는다.

- 여기서 정렬 실수를 했는데, 정렬 순서는 반 번호, 이름 길이, 이름 순서에 따라 정렬을 해야 한다.

- 반 번호와 이름을 문자열로 입력을 받는데, 반 번호 정렬을 문자열 기준으로 정렬하여 틀렸다.

- 반 번호 정렬을 할 때, 반 번호를 int형으로 변환하여 정렬하면 된다.

 

7. 소스 코드

import sys
input=sys.stdin.readline

N, M = map(int, input().split()) # 학급 수 N, 학급당 신청 가능한 인원 수 M

temp_even = [] # 짝수 백팀
temp_odd = [] # 홀수 청팀

temp_num = [0,0,0,0,0,0,0,0,0,0] # 반 수 제한

while True :
    num, name = map(str, input().split()) #반과 이름 입력

    # 입력값이 0이면 종료
    if num== '0' and name == '0' : break

    #출전 가능 인원 M이 안됐으면
    if temp_num[int(num)-1] < M :
        # 반 출전한 인원 1 증가 시키고
        temp_num[int(num)-1] += 1

        # 백팀(짝수)면
        if int(num) % 2 == 0:
            temp_even.append([num, name])

        # 청팀(홀수)면
        else:
            temp_odd.append([num, name])

# 반 숫자 정렬 후, 이름 정렬
temp_odd.sort(key = lambda x : (int(x[0]), len(x[1]), x[1]))
temp_even.sort(key = lambda x : (int(x[0]), len(x[1]), x[1]))

# 청팀 출력
for i,j in temp_odd :
    print(i,j)

# 백팀 출력
for i,j in temp_even :
    print(i,j)

 


 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기