<aside> 👉🏿 문제 링크
</aside>
<aside> 👉🏿 배열이 주어지고 이를 정렬하는 문제이다.
</aside>
<aside> 👉🏿 시간 복잡도 N(logN)으로 풀어야하는 문제.
따라서 퀵 정렬로는 풀 수 없고 아래 방법으로 풀 수 있다.
<aside> 👉🏿 병합정렬을 다시 상기시켜 보자.
먼저 받은 리스트를 전부 분할해준다.
다시 병합하면서 정렬을 해나간다.
</aside>
<aside> 👉🏿 병합 정렬 코드로 구현
</aside>
def merge(arr1, arr2):
result = []
# 투포인터 초깃값 설정
i = j = 0
# 포인터들이 리스트의 길이보다 길지 않을때 작동
while i < len(arr1) and j < len(arr2):
# 첫번째 리스트가 더 작을 경우 결과값에 추가, i포인터 +1
if arr1[i] < arr2[j]:
result.append(arr1[i])
i += 1
# 두번째 리스트가 더 작을 경우 결과값 추가, j포인터 +1
else:
result.append(arr2[j])
j += 1
# 모두 비교한 후 뒤에 붙히기
while i < len(arr1):
result.append(arr1[i])
i += 1
while j < len(arr2):
result.append(arr2[j])
j += 1
return result
def mergesort(lst):
# 리스트 길이가 1보다 작으면 리스트를 그대로 반환
if len(lst) <= 1:
return lst
# 중간 지점 설정
mid = len(lst) // 2
# 중간 지점을 기준으로 좌우 나눈다.
L = lst[:mid]
R = lst[mid:]
# 병합정렬
return merge(mergesort(L), mergesort(R))
<aside> 👉🏿 heapq를 이용한 풀이이다.
</aside>
class Solution:
def sortArray(self, nums):
heap = []
for num in nums :
heapq.heappush(heap, num)
list = [heapq.heappop(heap) for _ in range(len(nums))]
return list
solution = Solution()
print(solution.sortArray([5,2,3,1]))
<aside> 👉🏿 최소힙을 직접 구현하는 것은 최대힙 구현과 크게 다르지 않다.
아래는 최소힙을 직접 구현하고 배열 정렬을 해보았다.
</aside>