티스토리 뷰

728x90
반응형

문제

 

2차원 평면 위의 점 N개가 주어진다. 

좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

 

입력

 

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 

둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 

좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

 

출력

 

첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.

 

풀이

 

문제에서 주어진 기준은 파이썬에서 다차원 리스트를 정렬할 때 기본적으로 사용하는 기준이다.

 

따라서 그냥 아래처럼 정렬해도 답은 맞출 수 있다.

import sys

n = int(sys.stdin.readline())

b = []

for _ in range(n):
    temp = list(map(int, list(sys.stdin.readline().strip().split())))
    b.append(temp)

b.sort()

for i in b:
    print(*i)

하지만 문제의 의도가 다중정렬에 관한 연습에 있고,

 

바로 다음 문제인 11651번에선 y좌표를 먼저 정렬하라고 시키기 때문에

 

여기서 한 번 짚고 넘어가는게 편하다.

 

우선 코드를 먼저 보자.

import sys

n = int(sys.stdin.readline())

b = []

for _ in range(n):
    temp = list(map(int, list(sys.stdin.readline().strip().split())))
    b.append(temp)

c = sorted(b, key=lambda x: (x[0], x[1]))

for i in c:
    print(*i)

정렬 부분에 sorted()함수가 사용된 것을 확인할 수 있다.

 

여기서 sorted()함수는 반복 가능한 객체(리스트, 튜플, 세트 등)를 매개변수로 받아 정렬해주는 기능을 한다.

 

추가로 정렬 기준 역시 key 매개변수로 입력받는데, 이 경우에 우리가 원하는 정렬 방식을 함수로 전달해주면 된다.

 

위 코드에 적힌 람다식은 우리가 원하는, x좌표를 먼저, 그 다음 y좌표를 오름차순으로 정렬하는 식이다.

 

내림차순으로 정렬하려면? reverse=True 매개변수를 추가해주면 된다.

 

이 경우 코드는 아래와 같이 구성된다.

import sys

n = int(sys.stdin.readline())

b = []

for _ in range(n):
    temp = list(map(int, list(sys.stdin.readline().strip().split())))
    b.append(temp)

c = sorted(b, key=lambda x: (x[0], x[1]), reverse=True)

for i in c:
    print(*i)

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함