본문 바로가기
알고리즘/정렬

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

by 호리미 2022. 1. 20.

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

 

<코드 1 - 파이썬 리스트 정렬 이용>

- 입력을 받을 때 sys.stdin.readline을 사용하지 않아도 시간초과 없이 해결 됐다 (4524ms)

- sys.stdin.readline을 사용했을 때는 (412ms)

- 파이썬 내장 함수 사용하면 되기 때문에 간단했다.

n = int(input())
nums = []
#좌표 입력 받기
for _ in range(n):
    nums.append(list(map(int, input().split())))

# 정렬
nums = sorted(nums, key = lambda x:(x[0],x[1]))

#출력
for n in nums:
    print(n[0], n[1])

 

<코드 2 - heapq 이용>

- 입력을 받을 때 sys.stdin.readline을 사용하지 않으면 시간초과,,,

- sys.stdin.readline을 사용하니까 시간이 404ms가 나왔다.

- 입력을 받으면서 힙에 넣어주고, 입력이 끝나면 다시 하나씩 빼면서 프린트한다.

- heapq는 최소힙이 디폴트이기 때문에 따로 지정해야하는 것은 없었다.

import heapq
import sys
input = sys.stdin.readline
n = int(input())
h = [] #힙

#입력을 받고, 힙에 넣어줌
for i in range(n):
    x,y = map(int, input().split())
    heapq.heappush(h,(x,y))
#하나씩 뽑으면서 출력    
for _ in range(n):
    x,y = heapq.heappop(h)
    print(x, y)