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 정렬이 하고싶다면 앞에 마이너스를 붙여주면 된다. -
파이썬 정렬은 너무 좋다.