학생 N명의 이름과 국어, 영어, 수학 점수가 주어질 때, 다음과 같은 조건으로 학생의 성적을 정렬하는 프로그램을 작성해야 한다.
[1] 국어 점수가 감소하는 순서로
[2] 국어 점수가 같으면 영어 점수가 증가하는 순서로
[3] 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
[4] 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)
먼저 학생 n명의 이름과 성적을 students라는 리스트에 저장한다.
students = []
for _ in range(n):
students.append(list(sys.stdin.readline().split()))
이제 4가지 기준에 따라 students를 정렬해야 하는데, sort()의 key 값을 lambda 함수로 지정하면 쉽게 해결할 수 있다.
students.sort(key=lambda stu: (-int(stu[1]), int(stu[2]), -int(stu[3]), stu[0]))
여기서 주의해야 할 점이 있다!
점수를 내림차순으로 정렬하고 싶다면 인자 앞에 '-'를 붙이면 되는데, '-'는 문자열에 대해 적용될 수 없기 때문에 int()를 통해 형 변환을 해줘야 한다는 점이다.
만약 형 변환 없이 입력 받은 문자형 점수에 '-'를 붙이면 아래와 같은 에러가 뜬다.
students.sort(key=lambda stu: (-stu[1], stu[2], -stu[3], stu[0]))
^^^^^^^
TypeError: bad operand type for unary -: 'str'
출력의 경우 정렬된 학생들의 이름만 출력하면 되므로, for 문을 돌면서 각 원소의 첫 번째 값만 출력해준다.
for student in students:
print(student[0])
import sys
n = int(sys.stdin.readline())
students = []
for _ in range(n):
students.append(list(sys.stdin.readline().split()))
students.sort(key=lambda stu: (-int(stu[1]), int(stu[2]), -int(stu[3]), stu[0]))
for student in students:
print(student[0])