Problem Solving

[PS]좌표 정렬하기

CoBool 2020. 12. 10. 22:57

단어 정렬하기와 비슷한 문제.

좌표가 입력되고 해당 좌표를 x좌표의 오름차순으로 정렬하고,

x좌표가 같은 경우 다음은 y좌표로 정렬하여 출력해야 하는 문제이다.

import math

def mergesort(entries):
	if isinstance(entries,list) and len(entries) > 1 :
		pivot = math.floor(len(entries)/2)-1
		first = mergesort(entries[:pivot+1])
		second = mergesort(entries[pivot+1:])
		return merge(first,second)
	else:
		return entries
		
def merge(first,second):
	unit=[]
	
	if not isinstance(first,list):
		first = [first]
	if not isinstance(second,list):
		second = [second]
		
	first_p = second_p = 0
	while first_p < len(first) and second_p < len(second):
			firstr = list(map(int,first[first_p]))
			secstr = list(map(int,second[second_p]))
			
			if firstr[0]<secstr[0]:
				unit.extend([first[first_p]])
				first_p+=1
			elif secstr[0]<firstr[0]:
				unit.extend([second[second_p]])
				second_p+=1
			else:
				if firstr[1]<=secstr[1]: 
					unit.extend([first[first_p]])
					first_p+=1
				elif secstr[1]<firstr[1]:
					unit.extend([second[second_p]])
					second_p+=1
				
		
	if first_p >= len(first) and second_p < len(second):
		unit.extend(second[second_p:])
	else:
		unit.extend(first[first_p:])
		
	return unit
			


num = int(input())
entries=[]
for n in range(0,num):
	entries.extend([input().split()])
	
entries = mergesort(entries)

for x in entries:
	for y in x:
		print(y,end=' ')
	print('')
	

 

정렬 알고리즘은 병합 정렬을 응용하였다.

단어 정렬과 로직이 비슷해서 조금만 바꿔서 하면 쉽게 풀릴 줄 알았으나,

어째 쉽지가 않았다.

 

위 알고리즘의 로직은 다음과 같다.

 

1.병합 정렬에 따라 각 리스트의 크기가 1이 될 때까지 계속해서 절반으로 쪼갠다.

2.리스트의 크기가 1이 되면, 첫번째를 first, 두 번째를 second로 해서 병합을 실행한다.

3.병합을 실행하는 과정에서, 한 덩어리에 여러 개의 좌표가 포함되어 있을 수 있으므로, 각각의 포인터를 둔다.

4.해당 포인터 인덱스의 좌표를 불러와 비교를 진행.

5.어느쪽이 더 작은가를 판단하여, 작은 쪽을 결과 리스트에 붙이고 작았던 리스트의 포인터를 1 증가 시킨다.

6.위 과정을 반복하여 어느 쪽 하나가 끝에 다다르면, 나머지 리스트의 남은 부분을 결과에 가져다 붙인다.

7.이런 식으로 끝까지 정렬을 진행하며 합병을 완료.