본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 10825번: 국영수 -Python

728x90

[백준알고리즘] 10825번: 국영수 -Python

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

 

10825번: 국영수

첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 100보다 작거나 같은 자연수이다. 이름은 알파벳 대소문자로 이루어진 문자열이고, 길이는 10자리를 넘지 않는다.

www.acmicpc.net

간단한 정렬문제이다. 요즘 정렬 문제들을 푸는데 파이썬으로는 너무 간단하게 풀려서.... 몇 가지 문제를 제외하고는 안 올릴 예정이고 대신 Sorting Algorithm을 복습할 겸 공부해서 올려야겠다.

 

이 문제도 마찬가지로 리스트의 sort()를 사용하면 간단하게 해결이 가능하다. 여기서, 정렬 기준이 순서대로 다음과 같이 주어졌다.

1. 국어 점수 내림차순

2. 영어 점수 오름차순

3. 수학 점수 내림차순

4. 영어 이름 오름차순

 

그리고 여기서 4번째 영어 이름 오름차순에서 말하는 아스키 코드대로 대문자가 더 작게 표시하라는 ABCD...XYZabcd...xyz 순서대로 출력을 하라는 말이다. 실제로 아스키코드에서 대문자 알파벳 A~Z는 65~91에 해당하고 소문자 a~z는 97~122에 해당한다.

 

하지만 파이썬에서는 그런거 없이 sort에서 다 처리해서 나온다. 여기서 입력 요소가 리스트이며 정렬 기준을 key로 설정하기 위해서 lambda를 사용했다. 이 lambda에 입력을 해줄때 리스트를 사용하면 원하는 순서대로 여러 개의 키를 동시에 적용시킬 수 있다. 내림차순을 위해서는 -를 앞에 붙여줌으로써 해결할 수 있다.

 

import sys

N = int(sys.stdin.readline())
table = [list(sys.stdin.readline().split()) for _ in range(N)]

table.sort(key = lambda x: (-int(x[1]), int(x[2]), -int(x[3]), x[0]))

for student in table:
    sys.stdout.write(str(student[0]) + "\n")

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90