본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 아시아 정보올림피아드 : 2535번 - Python

728x90
반응형

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

 

2535번: 아시아 정보올림피아드

첫 번째 줄에는 대회참가 학생 수를 나타내는 N이 주어진다. 단, 3 ≤ N ≤ 100이다. 두 번째 줄부터 N개의 줄에는 각 줄마다 한 학생의 소속 국가 번호, 학생 번호, 그리고 성적이 하나의 빈칸을 사

www.acmicpc.net

 

 

 

문제를 풀면서 몰랐던 개념

 

(1) [Python] 2차원 배열 슬라이싱

-> 2차원 배열에서는 행에 대해서는 슬라이싱을 하지 않고 접근해야 한다!

arr = [[1, 2, 3, 4], [5, 6, 7, 8]]

[print(arr[i][:2]) for i in range(len(arr))]

>> [1, 2]
>> [5, 6]

 

(2) [Python] asterisk(*) 사용 용도

-> 곱셈과 거듭제곱

-> 리스트 확장

-> 가변 인자

-> Unpacking (이번 코드에서 배운 것!)

: 알고리즘을 짜다보면 결과 부분을 출력할 때, for문을 이용하여 list를 순회하며 출력하는 경우가 있는데 '*'를 사용하면 코드 길이도 줄고 훨씬 편리하다.

arr = [1, 2, 3, 4]
print(*arr)

>> 1 2 3 4

 

 

 

문제의 접근 방법

 

- 점수를 기준으로 내림차순 정렬

- 배열의 슬라이싱 사용

- 조건문을 통해 나라별 최대 메달 개수 2개로 제한하기

 

 

 

내가 막혔던 부분

 

- 2차원 배열에서의 슬라이싱을 통해 값을 추출하는 방법

- 나라별 최대 메달 개수가 2개가 되었을 때, 그 다음 나라에서 가장 점수가 높은 사람에게 메달을 부여하는 방법

 

 

 

문제 풀이 방법

 

참가 학생 수 n명 입력 받기 -> n번만큼 소속 국가, 학생 번호, 점수를 입력받아 리스트에 저장한 후 '점수'를 기준으로 내림차순 정렬을 한다 -> 금메달과 은메달은 같은 국가에 수여할 수 있으므로 인덱스 슬라이싱을 통해 2등까지 출력 -> 동메달(3등)을 출력하려 하는데 만약 금메달과 은메달 수상자가 같은 국가라면 그 다음 국가의 최고 점수 획득자 출력(건너뛰기), 그게 아니라면 바로 다음 순위자 출력.

 

 

 

소스코드

n = int(input())

arr = sorted([list(map(int, input().split())) for _ in range(n)], key=lambda x: -x[2])

print(*arr[0][:2])
print(*arr[1][:2])

if arr[0][0] == arr[1][0]:
    print(*arr[3][:2])
else:
    print(*arr[2][:2])
728x90
반응형