Algorithm

[알고리즘] 백준 11650 (파이썬 풀이)

truewayy 2022. 1. 10. 23:34
728x90

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)이렇게 출력해야 대괄호가 벗겨져서 출력된다.

 

728x90