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 정렬이 하고싶다면 앞에 마이너스를 붙여주면 된다. -
파이썬 정렬은 너무 좋다.
'Algorithm > acmicpc.net' 카테고리의 다른 글
이런건 어떻게 푸는거야 (#1377 버블소트) (0) | 2024.06.24 |
---|---|
파이썬 정렬이란2 (#11652 카드) (0) | 2024.06.24 |
구현 진짜 힘들다.... (#17144 미세먼지 안녕!) (0) | 2024.04.03 |
구현은 빡시다. (#15683 감시) (0) | 2024.03.27 |
카운팅은 애매하다. (#3190 뱀) (2) | 2024.03.27 |