[알고리즘] 백준 11650 (파이썬 풀이)
https://www.acmicpc.net/problem/11650
11650번: 좌표 정렬하기
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
www.acmicpc.net
문제
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())
li= []
for i in range(n):
li.append(list(map(int, input().split())))
li.sort(key=lambda x: (x[0], x[1]))
for a,b in li:
print(a,b)
문제풀이
이차원 리스트로 나오니 문제가 순간 이해가 안갔다.
천천히 읽어보니 그냥 5개의 좌표를 받아서 x좌표순으로 먼저 정렬하고, y좌표순으로 정리한 후
출력하면 해결되는 문제이다.
일단 입력은 readline()으로 받아 입력시간을 줄여주고
li라는 리스트를 하나 선언해준다.(좌표값을 저장하기 위한 용도)
그 다음에는 n개 만큼 좌표를 받아야 하므로 for문을 돌려 li에 좌표값을 넣어준다.
(이차원 리스트라 li.append 안에도 list를 또 써줘야 한다는 점..)
li가 채워진 후 정렬을 해야하는 데 앞에서 말한 것 처럼 x좌표 우선으로 정렬하고 y좌표 순으로 정렬하면 된다.
li.sort(key=lambda x: (x[0], x[1])) 에서 x[0]은 말그대로 li안쪽 list에서 0번째값을 우선으로 정렬,
그리고 x[1]은 1번째값을 우선으로 정렬하라는 뜻이다.
그리고 출력을 하면 되는데 이차원 리스트를 그냥 변수 하나로 for문을 돌려 출력하면
이 '[', ']' 대괄호가 벗겨지지 않고 출력된다. 그러므로 for a,b in li: 이것처럼
변수 두 개를 선언하여 출력도 print(a,b)이렇게 출력해야 대괄호가 벗겨져서 출력된다.