sorted() 사용법
sorted()는 인자값으로 넣은 배열을 정렬하여 return해주는 python의 함수입니다.
sorted(iterable, key, reverse)
arr
: 리스트같이 순회할 수 있는 객체(map, list 등등)key
: 함수를 넣어 사용자화된 정렬이 가능하게 함reverse
: 이 옵션이 True면 결과를 역순으로 반환
key 옵션
주로 lambda를 사용하고, 기본값은 lambda x : x
라고 생각할 수 있습니다.
예시1. 내림차순 정렬
lst = [3, 4, 1, 2]
# key 옵션 사용
result = sorted(lst, key=lambda x: -x)
# reverse 옵션 사용
result = sorted(lst, reverse = True)
print(result)
예시2. 특수한 정렬
두번째 요소를 기준으로 내림차순하는데, 값이 같다면 첫번째 요소를 기준으로 오름차순 정렬
lst = [(3, 10), (4, 20), (1, 30), (2, 20)]
result = sorted(lst, key=lambda x: (-x[1], x[0]))
print(result)
문제
스포츠 클라이밍은 1986 년에 시작된 실내 암벽 등반 스포츠이다. 선수들은 원래 리드 클라이밍 종목에서만 겨루었는데, 1989 년에 스피드 클라이밍이 추가되었고, 10 년 후인 1999 년에 볼더링 종목이 추가되었다. 올림픽 게임에서는 금, 은, 동메달을 결정하기 위하여 선수들은 세 종목에서 겨루어 종합 순위를 매긴다. 종합 순위는 세 종목에서 거둔 순위를 곱한 점수로 결정된다. 예를 들어, 어떤 선수가 리드에서 1 위, 스피드에서 5 위, 볼더링에서 2 위를 했다면 점수는 10 점이 된다. 곱한 점수가 낮은 선수가 종합 순위에서 앞선다.
선수 n명의 등번호와 이들이 세 종목에서 거둔 순위가 주어질 때, 금, 은, 동메달을 받을 선수를 결정하는 프로그램을 작성하시오. 두 선수의 곱한 점수가 같을 수도 있다. 이 경우, 세 종목 순위의 합산 점수가 낮은 선수가 이긴다. 두 선수의 곱한 점수와 합산 점수가 모두 같으면 등번호가 낮은 선수가 이긴다.
풀이
n명의 선수가 있고, 각 선수들의 등번호(b) 3종목의 순위(p, q, r)가 주어집니다.
정렬의 조건은 아래 3가지로 구성되어있습니다.
- 모든 순위를 곱한 값이 작은 선수가 등수가 높다. (p * q * r로 오름차순)
- 모든 순위를 곱한 값이 같으면, 모든 순위를 합한 값이 낮은 선수가 등수가 높다. (p + q + r로 오름차순)
- 모든 순위를 합한 값도 같으면, 등번호가 낮은 선수가 등수가 높다. (b로 오름차순)
한 줄에b p q r
형식으로 값이 주어지니 이 한줄을 x라 했을 때
lambda x : (x[1] * x[2] * x[3], x[1] + x[2] + x[3], x[0])
로 정렬을 나타낼 수 있습니다.
문제 풀이 결과
n = int(input())
infos = [list(map(int, input().split())) for _ in range(n)]
infos = sorted(infos, key=lambda x : (x[1] * x[2] * x[3], x[1] + x[2] + x[3], x[0]))
for b, p, q, r in infos[:3]:
print(b, end=' ')