Algorithm/acmicpc.net

파이썬 정렬이란 (#10825 국영수)

winney916 2024. 6. 24. 12:20
728x90

#10825 국영수 https://www.acmicpc.net/problem/10825

 

 

정렬 관련 문제였다. 

 

내 초기 코드는 다음과 같았다.

 

from sys import stdin

input = stdin.readline

n = int(input())

students = []

for _ in range(n):
    x = input().split()
    student, grades = x[0], list(map(int, x[1:]))
    students.append([student] + grades)


# 국어 점수가 감소하는 순서로
# 국어 점수가 같으면 영어 점수가 증가하는 순서로
# 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
# 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)

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

for s in students:
    print(s[0])

 

마지막 정렬기준인 "사전 순 증가, (아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다)."의 충족을 위해 ord(x[0][0])을 추가했다.

 

하지만 제대로 작동하지 않았다.

 

그도 그럴것이, 문자열의 첫 인덱스만 반영하고 있기 때문이다.

최대 10의 길이를 갖는 문자열을 비교해야하는데, 모든 인덱스를 어떻게 반영해야할지 고민이 됐다.

 

근데 사실, 파이썬이 알아서 해준다.

 

 

정답코드

from sys import stdin

input = stdin.readline

n = int(input())

students = []

for _ in range(n):
    x = input().split()
    student, grades = x[0], list(map(int, x[1:]))
    students.append([student] + grades)


# 국어 점수가 감소하는 순서로
# 국어 점수가 같으면 영어 점수가 증가하는 순서로
# 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
# 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)
# -> 그냥 정렬 키로 넣으면 알아서 해준다.

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

for s in students:
    print(s[0])

 

x[0]

그냥 문자열을 키로 넣어주면, 사전순으로 정렬해준다.

 

개꿀

 

+) 파이썬 sort에서 키로 람다함수를 넣어줄 때, reverse 정렬이 하고싶다면 앞에 마이너스를 붙여주면 된다. -

 

 

파이썬 정렬은 너무 좋다.