정렬 기준에 관련된 문제였다.
우선 정렬 기준과 차선 정렬 기준을 적용해서 정렬하는 문제이다.
파이썬에서는 정말 간단하게 두 가지 조건을 sort()나 sorted()함수에 적용할 수 있다.
sort()의 파라미터에는 key= 을 지정할 수 있다.
key= 뒤에는 lambda를 이용해서 함수를 구현할 수 있다.
미리 선언해놓은 함수의 이름을 써도 되고 이름 없는 무명의 함수를 바로 구현해도 된다.
data.sort(key=lambda e : (e[0], e[1]))
위의 코드를 보면,
lambda 라는 키워드 뒤에 e가 보인다.
이 e 가 의미하는 것은 data라는 리스트(iterative)에서 하나의 원소를 의미한다.
유사한 개념으로는 for-each를 생각할 수 있다.
for-each에서 리스트에 담겨져 있는 하나 하나의 원소가 직접 e라는 변수에 할당된다고 생각하면 된다.
뒤에 콜론(:)이 나오고 그 뒤에는 정렬 조건을 작성한다.
e[0]만 작성한다면 정렬은 data리스트의 각 원소의 첫 번째 원소들을 기준으로 정렬될 것이다.
만약 위의 코드처럼 괄호안에 두 개의 조건을 넣어준다면,
일단 e[0]을 기준으로 정렬을 하고 만약 동일한 값이 존재한다면 e[1]의 조건을 이용해 정렬한다.
정렬 기준마다 오름차순과 내림차순을 다르게 적용해줄 수도 있다.
다시 문제로 돌아와서,
처음에는 x 좌표를 기준으로 정렬을 하지만 만약에 x 좌표가 같다면 y좌표를 기준으로 정렬하기 위해서
위처럼 코드를 작성했다.
[소스 코드]
import sys
n = int(sys.stdin.readline().rstrip())
data = []
for i in range(n):
data.append(tuple(map(int, sys.stdin.readline().rstrip().split())))
data.sort(key=lambda e : (e[0], e[1]))
for i in range(n):
for j in range(2):
if j == 0:
print(data[i][j], end=' ')
else:
print(data[i][j])
[백준] 1181번 - 단어 정렬 (정렬) - 결과 포함 (0) | 2021.02.02 |
---|---|
[백준] 11651번 - 좌표 정렬하기 2 (정렬) - 결과 포함 (0) | 2021.02.02 |
[백준] 1427번 - 소트인사이드 (정렬) - 결과 포함 (0) | 2021.02.02 |
[백준] 2108번 - 통계학 (정렬) - 결과 포함 (0) | 2021.02.02 |
[백준] 10989번 - 수 정렬하기 3 (정렬) - 결과 포함 (0) | 2021.02.02 |