상세 컨텐츠

본문 제목

[백준] 11650 - 좌표 정렬하기 (정렬) - 결과 포함

개발 공부 (알고리즘)

by letprogramming 2021. 2. 2. 02:01

본문

반응형

www.acmicpc.net/problem/11650

 

11650번: 좌표 정렬하기

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

www.acmicpc.net

정렬 기준에 관련된 문제였다.

우선 정렬 기준과 차선 정렬 기준을 적용해서 정렬하는 문제이다.

 

파이썬에서는 정말 간단하게 두 가지 조건을 sort()나 sorted()함수에 적용할 수 있다.

sort()의 파라미터에는 key= 을 지정할 수 있다.

key= 뒤에는 lambda를 이용해서 함수를 구현할 수 있다.

미리 선언해놓은 함수의 이름을 써도 되고 이름 없는 무명의 함수를 바로 구현해도 된다.

data.sort(key=lambda e : (e[0], e[1]))

위의 코드를 보면,

lambda 라는 키워드 뒤에 e가 보인다.

이 e 가 의미하는 것은 data라는 리스트(iterative)에서 하나의 원소를 의미한다.

유사한 개념으로는 for-each를 생각할 수 있다.

for-each에서 리스트에 담겨져 있는 하나 하나의 원소가 직접 e라는 변수에 할당된다고 생각하면 된다.

 

뒤에 콜론(:)이 나오고 그 뒤에는 정렬 조건을 작성한다.

e[0]만 작성한다면 정렬은 data리스트의 각 원소의 첫 번째 원소들을 기준으로 정렬될 것이다.

만약 위의 코드처럼 괄호안에 두 개의 조건을 넣어준다면,

일단 e[0]을 기준으로 정렬을 하고 만약 동일한 값이 존재한다면 e[1]의 조건을 이용해 정렬한다.

 

정렬 기준마다 오름차순과 내림차순을 다르게 적용해줄 수도 있다.

 

다시 문제로 돌아와서,

처음에는 x 좌표를 기준으로 정렬을 하지만 만약에 x 좌표가 같다면 y좌표를 기준으로 정렬하기 위해서

위처럼 코드를 작성했다.

 

[소스 코드]

import sys

n = int(sys.stdin.readline().rstrip())

data = []

for i in range(n):
    data.append(tuple(map(int, sys.stdin.readline().rstrip().split())))

data.sort(key=lambda e : (e[0], e[1]))

for i in range(n):
    for j in range(2):
        if j == 0:
            print(data[i][j], end=' ')
        else:
            print(data[i][j])
반응형

관련글 더보기