반응형

문제

2차원 평면 위의 점 N개가 주어진다. 좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 

출력하는 프로그램을 작성하시오.

입력

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다.

 (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

출력

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






이전문제에서 달라진점은 정렬의 우선순위가 y라는 점이다.

이전코드에서 배열의 0 과 1 부분만 바꿔주면 되지만 이전에 구현하지 않았던 병합정렬을 통해 구현해보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import sys
 
 
 
n=int(sys.stdin.readline())
xy_list=[[int(i) for i in sys.stdin.readline().split()] for _ in range(n)]
 
 
#합병정렬
def mergeSort(li):
    if len(li)<=1:
        return li
    mid=len(li)//2
 
    left=li[:mid]
    right=li[mid:]
 
    left1=mergeSort(left)
    right1=mergeSort(right)
 
    return merge(left1,right1)
 
 
 
 
def merge(left,right):
    i = 0  # 인자위치
    j = 0
 
    arr = []
 
    while i<len(left) and j<len(right): #왼쪽배열과 오른족 배열이 끝에 닿을때까지
        if left[i][1]<right[j][1]:#왼쪽의 y인자가 더작다면 먼저 arr에 추가해준다 같은점이 없다고 나와있지만 넣었다.
            arr.append(left[i])
            i+=1
        elif left[i][1]==right[j][1]:
            if left[i][0]<right[j][0]:#x인자 비교
                arr.append(left[i])
                i+=1
            else:
                arr.append(right[j])
                j+=1
        else:
            arr.append(right[j])
            j+=1
 
    while i<len(left): #위 과정이 끝나고 남은쪽은 차례대로 넣어준다.
        arr.append(left[i])
        i=i+1
    while j<len(right):
        arr.append(right[j])
        j=j+1
 
    return arr
 
 
xy_list=mergeSort(xy_list)
 
for i in range(len(xy_list)):
    print(xy_list[i][0],xy_list[i][1])

cs




반응형

'알고리즘(python) > 정렬' 카테고리의 다른 글

[Python]정렬 백준 10814  (0) 2020.01.02
[Python]정렬 백준 1181  (0) 2020.01.02
[Python]정렬 백준 11650  (0) 2020.01.01
[Python]정렬 백준 1427  (0) 2020.01.01
[Python]정렬 백준 2108  (0) 2019.12.27
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기