본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 좌표 정렬하기 2 : 11651번 - Python

728x90
반응형

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

 

 

 

문제를 풀면서 몰랐던 개념

 

 (1) [Python] 2차원 배열 만들기

-> 문제에서는 입력 받은 두 x,y 좌표 값을 묶어서 총 n개만큼 저장하여 리스트에 넣으려고 했기 때문에 2차원 배열이 필요했다.

# 반복문을 통해 n번만큼 x,y 좌표 값을 입력받는다.

for i in range(n):
    x,y = input().split()
    
    # x,y 값을 정수로 형변환
    x = int(x)
    y = int(y)
    
    # 2차원 배열로 입력받기 위해서는 [] 먼저 추가한 후 그 안에 요소 값을 추가하기!!!
    arr.append([])
    arr[i].append(x)
    arr[i].append(y)
    
    
    # 출력 예시
    >>> [[1, 2], [3, 6], [1 6]]

 

(2) [Python] lamda 함수

-> lamda 함수는 익명 함수로 단발적으로 쓰이는 함수를 말한다. 이 때, 함수를 아주 간단하게 쓰면 lamda가 된다고 생각하면 쉽다.

# 기존 식
def add(x):
	return x+10
    
# lamda 함수를 사용하여 바꾼 식
add = lambda x: x+10

lamda는 if문에서도 사용할 수 있으며, 그 밖에도 다양하게 쓰인다. 그 중에서도 sort 메소드와 함께 사용되는 경우가 많다!!!

 

(3) 2차원 배열에서 첫 번째 인덱스가 아닌 다른 인덱스에 대해서 정렬하기

-> 이 때, lamda 함수를 사용해서 정렬 가능!

# x:() 의 괄호 안에 튜플 형식으로 집어넣기.

lst = [[2, 1], [3, 4], [1, 2], [1, 3], [3, 2]]
lst.sort(key=lambda x: (x[1], x[0]))
print(lst)

>>> [[2, 1], [1, 2], [3, 2], [1, 3], [3, 4]]

첫 번째 인덱스에 대해 오름차순으로 정렬하고, 같은 값의 경우 오름차순으로 재정렬까지 시켜주는 것을 볼 수 있다.

 

(4) for문을 사용해서 2차원 리스트의 요소를 인덱스로 접근하여 출력하기

a = [[10, 20], [30, 40], [50, 60]]
 
for i in range(len(a)):            # 세로 크기
    for j in range(len(a[i])):     # 가로 크기
        print(a[i][j], end=' ')
    print()
    
    
 # 실행 결과
 10 20
 30 40
 50 60

 

 

 

문제의 접근 방법

 

- 2차원 평면 위의 점 n개 입력받기

- n개의 줄만큼 i번 점의 위치 Xi와 Yi 입력받기(좌표는 정수).

- y좌표가 증가하는 순으로 정렬 (두 y좌표가 같다면 x좌표가 증가하는 순으로 정렬).

 

 

내가 막혔던 부분

 

(1) 입력받은 좌표의 값을 x,y 쌍으로 취급해야 하는데, 일일히 다른 값으로 리스트에 추가하려고 했음. (2차원 배열 활용 미숙)

(2) 첫 번째 인덱스 값이 아닌 다른 인덱스 값을 기준으로 정렬하는 방법을 알지 못함.

(3) 반복문을 사용해서 2차원 리스트의 요소들을 출력하는 방법을 알지 못함.

 

 

 

문제 풀이 방법

 

입력받을 좌표의 개수 n개 입력받기 -> 입력받은 좌표들을 넣어 줄 빈 리스트 arr 선언 -> for문을 통해 x,y 좌표값을 n개 입력받기 -> 각 좌표의 쌍별로 리스트에 추가하기(2차원 배열 생성) -> 만들어진 리스트를 두 번째 인덱스 값을 기준으로 정렬 -> 정렬한 리스트 arr를 출력 형식에 맞게 중첩 for문을 사용해서 출력하기.

 

* 다른 사람들의 코드를 참고해보니 x,y 좌표값의 인덱스 위치를 바꿔서 정렬한 후, 다시 바꿔주는 방법도 있다는 것을 알게 되었다.

 

 

소스코드

n = int(input())

arr = []

for i in range(n):
    x,y = input().split()
    x = int(x)
    y = int(y)
    arr.append([])
    arr[i].append(x)
    arr[i].append(y)
arr.sort(key=lambda x: (x[1], x[0]))

for i in range(len(arr)):   # 세로 크기
    for j in range(len(arr[i])):  # 가로 크기
        print(arr[i][j], end=' ')
    print()
728x90
반응형