[코딩테스트 공부] 국영수(정렬)

Doccimann·2022년 3월 1일
0
post-custom-banner

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


일단 코드부터 보실까요?

import sys

input = sys.stdin.readline

N = int(input())
score_list = []

# 학생 점수 입력
for _ in range(0, N):
    input_data = input().split()
    score_list.append([input_data[0], int(input_data[1]), int(input_data[2]), int(input_data[3])])
    
sorted_score_list = sorted(score_list, key=lambda x: (-x[1], x[2], -x[3], x[0]))

for sorted_data in sorted_score_list:
    print(sorted_data[0])

코드에 대한 설명

이번 문제는 코딩테스트 유형 중 정렬 에 관한 문제 중 하나를 가져와서 다뤄봤습니다.

위의 코드를 보면 매우 간결한 것을 확인할 수 있는데요, 파이썬은 기본적으로 내장함수로 정렬 기능을 매우 강력하게 지원합니다. 외쳐라 갓 파이썬

일단은, sorted 함수에 대해서 설명을 하고 시작해보겠습니다.


sorted 함수

sorted 함수는, 인자로 정렬하고자 하는 리스트를 하나 받아와서, 주어진 key의 정보에 따라 정렬을 하여 리스트를 반환하는 함수입니다.

key의 정보는 lambda 함수를 통해 튜플을 전달하면, sorted는 주어진 key의 정보에 따라 정렬을 수행합니다.

sorted_score_list = sorted(score_list, key=lambda x: (-x[1], x[2], -x[3], x[0]))

key에 lambda x: (-x[1], x[2], -x[3], x[0]) 를 전달한 모습을 확인할 수 있는데요, 이렇게 전달한 이유는, 문제의 조건에 의해 국어 점수, 영어 점수는 내림차순, 그 외에는 오름차순 으로 정렬을 해야하기 때문입니다. (sorted의 기본 정렬은 오름차순이 디폴트랍니다)


코드에 대한 해설

저는 입력을 받기 위해서 파이썬의 sys에 포함되어있는 sys.stdin.readline을 이용하여 문자열을 입력받는 것으로 하였습니다. (일반적인 input() 함수에 비해서 속도가 더 빨라요)

for _ in range(0, N):
    input_data = input().split()
    score_list.append([input_data[0], int(input_data[1]), int(input_data[2]), int(input_data[3])])

input().split()을 통해서 공백 기준으로 문자열을 쪼갠 뒤에, score_list에는 첫번째 인자는 학생 이름이므로 그대로 넣고, 그 이후의 인자는 int로 감싸서 자연수의 형태로 저장을 하였습니다.

이후에는, 위에서 서술한 방식대로 정렬을 하고, 정렬된 리스트에서 이름만 출력하게끔 print를 하였습니다.

profile
Hi There 🤗! I'm college student majoring Mathematics, and double majoring CSE. I'm just enjoying studying about good architectures of back-end system(applications) and how to operate the servers efficiently! 🔥
post-custom-banner

0개의 댓글