알고리즘, 자료구조/백준

[Python/파이썬] 백준 알고리즘 11651번 / 좌표 정렬하기 2

동김 2022. 11. 10. 01:48

[Python/파이썬] 백준 알고리즘 11651번 / 좌표 정렬하기 2

 

문제 링크: https://www.acmicpc.net/problem/11651

 

11651번: 좌표 정렬하기 2

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

www.acmicpc.net


최종 소스코드

 

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

for i in range(N):
    a = list(map(int, sys.stdin.readline().split()))
    arr.append(a)
arr = sorted(arr, key = lambda x : (x[1], x[0]))
for i in range(N):
    print(arr[i][0], arr[i][1])

 


<풀이>

간단한 문제지만 x값이 아닌 y값으로 정렬해야 해서 sort()에서의 key lambda를 사용하는 법을 배울 수 있는 문제이다. 

 

1. input VS sys.stdin.readline()

for i in range(N):
    a = list(map(int, sys.stdin.readline().split()))
    arr.append(a)

N은 최대 100000으로 입력이 자주 반복되므로 sys.stdin.readline()으로 입력을 받아준다. input()과의 차이는 (1) input() 내장 함수는 parameter로 promt message를 받을 수 있기 때문에 이 출력 여부로 인해 시간이 딜레이 된다. (2) input() 내장 함수는 입력받은 값의 개행문자를 삭제시켜 반환한다. 이런 차이로 백준을 풀때 특히 '입력이 자주 반복될 경우'에 input() 대신 sys.stdin.readline을 쓰면 시간 초과 문제를 해결할 수 있다. 

 

2. sort()에서의 key lambda 사용

arr = sorted(arr, key = lambda x : (x[1], x[0]))

인자없이 sorted()만 쓰면, 리스트의 각 요소 순서대로 정렬을 한다. 리스트의 두 번째 인자를 기준으로 오름차순으로 먼저 정렬하고, 첫 번째 인자를 기준으로 내림차순으로 정렬하게 하려면, 다음과 같이 하면된다. x[1]앞에 -를 붙이면 내림차순으로 정렬된다.