멋쟁이v의 개발일지

[백준 11650번] 좌표 정렬하기(파이썬) 본문

0년차/알고리즘(정렬)

[백준 11650번] 좌표 정렬하기(파이썬)

멋쟁이v 2022. 12. 5. 06:00
728x90
320x100
문제
2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

 

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

 

예제 입력
5
3 4
1 1
1 -1
2 2
3 3
예제 출력
1 -1
1 1
2 2
3 3
3 4

 


 

풀이
이 문제는 좌표 x, y가 주어지면 x를 먼저 정렬하고, y를 정렬한다는 문제입니다.

만약 좌표 3개가 주어진다면 먼저 이 좌표를 리스트로 만들어 줍니다.
[[3, 4], [1, 1], [1, -1]]

이렇게 리스트 안에 또 다른 리스트가 들어가게 되는데 이대로 정렬을 해주게 되면
[[1, -1], [1, 1], [3, 4]]
x, y 좌표가 정렬이 됩니다. 하지만 출력은 리스트를 벗어내야 하는데요.

정렬된 리스트를 일반적인 인덱싱으로 출력을 한다면
[0] = [1, -1]
[1] = [1, 1]
[2] = [3, 4]
[1, -1], [1, 1], [3, 4] -> 리스트형태로 출력

만든 리스트 형태가 이중 리스트 형태라서 [x][y] 형태로 출력을 해야 각각의 원소들을 뽑아낼 수 있어요.
[0][0] = 1, [0][1] = -1
[1][0] = 1, [1][1] = 1
[2][0] = 3, [2][1] = 4
이렇게 인덱싱을 해주면 리스트를 벗어나서 원하는 출력이 가능합니다.
정답 : 1 -1 / 1 1 / 2 2 / 3 3 / 3 4

코드를 순서대로 작성한다면
1. x, y좌표를 담을 빈 리스트 선언
2. x, y좌표를 입력 후 리스트에 추가
3. 정렬
4. 인덱싱해서 각 원소들을 출력


작성 코드
import sys

N = int(input())
arr = []

for _ in range(N) # x, y 좌표를 리스트에 추가
    a, b = map(int, sys.stdin.readline().split())
    arr.append([a, b])
    
arr.sort() # 정렬

for i in range(N):
    print(arr[i][0], arr[i][1]) # 리스트 원소(x좌표, y좌표)들을 뽑아내서 출력
728x90
320x100
Comments