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)

문제

BOJ 23246 문제

스포츠 클라이밍은 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=' ')