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
input = sys.stdin.readline
n = int(input())
if (n < 1 or n > 100000):
exit()
li = []
for _ in range(n):
[a, b] = map(int, input().split())
li.append([a, b])
li = sorted(li)
for i in range(n):
print(li[i][0], li[i][1])
풀이
문제를 푸는 것보다 이해하는데 더 오래걸린 문제 같다. 입력값과 출력값을 보았을 때 그저 정렬을 해주고 출력하는 문제 같아서 그렇게 풀어주었다.
1~2행 : python은 기본적으로 느리기 때문에 input()을 기본적으로 사용하게 된다면 time out 이 될 가능성이 높다. 그렇기 때문에 입력을 받는데 input() 보다 빠른 sys.stdin.readline 을 사용하기 위해 sys 를 import 해주고 input 에 넣어줌으로서 sys.stdin.readlin 을 input 으로도 사용할 수 있게 된다.
import sys
input = sys.stdin.readline
4~6행 : n 의 값을 입력받고 조건의 1 <= n < 100,000 을 해주기 위하여 해당 조건문을 걸어준다. 만약 저 값에 해당하게 된다면 강제종료가 된다.
n = int(input())
if (n < 1 or n > 100000):
exit()
8~11행 : li 라는 변수를 리스트로 선언해준다. 이후 n 에 입력된 값만큼 반복을 해주면서 [a, b] 리스트에 값을 입력받아 그대로 저장을 해준다. 이후 저장된 리트스를 li 에 저장을 해주며 이중배열로 만들어준다.
li = []
for _ in range(n):
[a, b] = map(int, input().split())
li.append([a, b])
13행 : li 에 저장된 값들을 sorted 명령어를 이용해 정렬을 해준다. 이번에는 li.sort() 가 아닌 sorted(li) 를 사용해줬는데 둘의 차이첨은 .sort() 와 같은 경우 원본을 정렬시켜버리고 sorted() 는 복사본을 만들어준다고 생각하면 편하다. 기본적으로 원본을 유지하기 위하여 li = sorted(li) 보다는 li_2 = sorted(li) 처럼 사용하는 경우에 사용된다.
li = sorted(li)
15~16행 : 다시 n 만큼 반복되고 i 는 0에서 부터 n 값 전까지 따라간다. 그러며 정렬되어 있는 값들을 최소값부터 하나씩 출력하게 된다.
for i in range(n):
print(li[i][0], li[i][1])
'BaekJoon > 단계별로 풀어보기' 카테고리의 다른 글
[백준] 정렬 - 1181번 (Python) (1) | 2023.02.14 |
---|---|
[백준] 정렬 - 11651번 (Python) (0) | 2023.02.13 |
[백준] 정렬 - 1427번 (Python) (0) | 2023.02.10 |
[백준] 정렬 - 2108번 (Python) (0) | 2023.02.09 |
[백준] 정렬 - 10989번 (Python) (0) | 2023.02.08 |