11650번: 좌표 정렬하기

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net


import sys
n = int(input())
lst = []
for _ in range(n):
  lst.append(list(map(int, sys.stdin.readline().split())))

lst.sort()
for a, b in lst:
  print(a, b)

첫 번째 값이 같으면 두 번째 값을 보고 정렬을 하는 문제인데 어떻게 정렬을 할까 하다가 일단 sort() 함수를 돌려보고 결과를 볼까? 해서 써봤는데 알아서 두 번째 값까지 정렬을 해주었다. 

 

궁금해서 다음과 같은 데이터도 넣어봤는데 

5
3 3 8
1 1 0
1 1 -2
2 2 3
3 3 4

세 번째 값까지 포함해서 정렬을 해주었다.

더보기

결과

1 1 -2
1 1 0
2 2 3
3 3 4
3 3 8

sort()함수가 어디까지 정렬을 자동으로 해주는지, 왜 이런 결과가 나오는지 설명이 되어 있는 문서는 못 찾았는데 추측으로는 전부 오름차순으로 알아서 정렬을 해주는 것 같다.

 

다른 사람들의 풀이도 궁금해서 찾아봤는데 대부분 lambda를 사용하는 것 같다. 

lambda는 함수를 간단하게 작성가능하게 해주는 표현식이다. 

lst.sort(key=lambda x :x[0]) #첫 번째 인자로 오름차순 정렬
lst.sort(key=lambda x :-x[0]) #첫 번째 인자로 내림차순 정렬1
lst.sort(key=lambda x :x[0],reverse=Tre) #첫 번째 인자로 내림차순 정렬2
lst.sort(key=lambda x :x[1]) #두 번째 인자로 오름차순 정렬
lst.sort(key=lambda x :(x[0],x[1])) #첫 번째 인자로 오름차순 정렬, 같으면 두 번째 인자로
lst.sort(key=lambda x :(x[1],x[0])) #두 번쨰 인자로 오름차순 정렬, 같으면 첫 번째 인자로
lst.sort(key=lambda x :(-x[0],x[1])) #첫 번째 인자로 내림차순 정렬, 같으면 두 번째 오름차순

 

람다 표현식을 ( )(괄호)로 묶은 뒤에 다시 ( )를 붙이고 인수를 넣어서 람다 표현식 자체를 호출할 수 있다. 

(lambda 매개변수들: 식)(인수들)

(lambda x: x + 10)(1)

 

이 람다 표현식을 이용하여 문제를 다시 풀었을 경우 코드는 다음과 같다. 

import sys
n = int(input())
lst = []
for _ in range(n):
  lst.append(list(map(int, sys.stdin.readline().split())))

lst.sort(key = lambda x: (x[0], x[1]))
for a, b in lst:
  print(a, b)

 

복사했습니다!