공부하자

[BOJ/python] 11650. 좌표 정렬하기 본문

Algorithm/BOJ

[BOJ/python] 11650. 좌표 정렬하기

dev_riley 2022. 4. 25. 23:52

문제

2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.

 

<나의 코드>

# 내가 작성한 코드
n = int(input())

arr = []
for i in range(n):
    arr.append(list(map(int, input().split())))

arr.sort()
for a in arr:
    for b in a:
        print(b, end=" ")
    print()

 

# 다른 분이 작성한 코드
import sys
n = int(input())
arr = []
for i in range(0, n):
    arr.append(sys.stdin.readline())

arr.sort(key=lambda x: (int(x.split()[0]), int(x.split()[1])))
print(" ".join(arr))

 

<REVIEW>

첫번째 코드가 내가 작성한 코드이다. 딱봐도 이중 for문에 입력 받는 방식때문에 시간이 오래 걸릴 것 같았다. 문제는 무사히 통과 되었지만 예상대로 엄청난 시간이 걸렸고, 실행 속도가 더 빠른 다른 분들의 코드를 참고했다. 먼저 대부분의 빠른 코드들은 sys.stdin.readline()을 썼고, 나처럼 이중 for문 대신 sort함수에서 key= lambda를 사용했다. sys.stdin.readline()은 파이썬 표준 라이브러리인 sys를 사용해 input()보다 훨씬 더 빨리 입력을 받을 수 있다고 하니 꼭 기억해둘것!!!

그리고 특정한 요소를 기준으로 정렬하고 싶을 때는 key=lambda를 지정하는 것이 sort함수와 많이 사용되는 것 같은데 너무 자주 봐서 거의 공식 처럼 외워야 할 것 같다. 어떤 블로거 분이 친절하게 공식화 해주셔서 아래에 적어본다. 많이 써서 꼭 익숙하게 만들어야 겠다. 아래 대괄호[]에 적은 요소가 key가 되어 그 key를 기준으로 정렬된다.

sorted ([list 혹은 dic], key = lambda x: [key로 지정하고 싶은 요소])

출처: https://engineer-mole.tistory.com/94 [매일 꾸준히, 더 깊이]

 

<출처>

https://www.acmicpc.net/problem/11650

Comments