반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

짧은코딩

10825 국영수(다중 정렬) 본문

코딩 테스트(Python)/이것이 취업을 위한 코딩 테스트다

10825 국영수(다중 정렬)

5_hyun 2022. 7. 22. 16:29

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

 

10825번: 국영수

첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1

www.acmicpc.net

 

해결법

이 문제를 처음 보고 너무 복잡하게 생각했다. 곰곰히 생각을 하다가 "이 지문에 나온 정렬 조건을 반대로 실행하면 어떨까?" 생각이 들었다. 그래서 구글링을 했고 파이썬에 다중 정렬을 봤다. 이 문법을 자주 사용했지만 매번 잊어버렸고 정식 이름을 알게된건 이번이 처음이다. 그레서 잘 기억해야 겠다고 생각했다. 

 

-다중 정렬

ary = sorted(ary, key = lambda x : x[0])

이렇게 lamda 함수를 사용하면되고 키 값을 사용하면 된다. x[i]에서 i 번째에는 정렬을 원하는 인덱스 숫자를 넣으면 그 인덱스 기준으로 정렬이 된다. 내림차순으로 정렬학고 싶으면 뒤에 reverse=True를 해주면 된다.

 

내 코드

n = int(input())

ary = []

for i in range(n):
    a, b, c, d = input().split()
    ary.append((a,int(b),int(c),int(d)))

ary = sorted(ary, key = lambda x : x[0], reverse=True)
ary = sorted(ary, key = lambda x : x[3])
ary = sorted(ary, key = lambda x : x[2], reverse=True)
ary = sorted(ary, key = lambda x : x[1])

for i in range(n-1, -1, -1):
    print(ary[i][0])

 

교재 코드

n = int(input())
students = [] # 학생 정보를 담을 리스트

# 모든 학생 정보를 입력 받기
for _ in range(n):
    students.append(input().split())

'''
[ 정렬 기준 ]
1) 두 번째 원소를 기준으로 내림차순 정렬
2) 두 번째 원소가 같은 경우, 세 번째 원소를 기준으로 오름차순 정렬
3) 세 번째 원소가 같은 경우, 네 번째 원소를 기준으로 내림차순 정렬
4) 네 번째 원소가 같은 경우, 첫 번째 원소를 기준으로 오름차순 정렬
'''
students.sort(key=lambda x: (-int(x[1]), int(x[2]), -int(x[3]), x[0]))

# 정렬된 학생 정보에서 이름만 출력
for student in students:
    print(student[0])

교재에서는 더 간단하게 풀었다. int와 -를 사용하면 더 효율적으로 다중 정렬을 사용할 수 있다.

728x90
반응형
Comments