Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 배열이 최대 힙(Max Heap) 형태인지 확인하는 방법

문제 이해하기

힙(Heap)은 완전 이진 트리(complete binary tree) 구조를 가지는 대표적인 자료구조입니다. 배열로 표현된 힙 트리가 주어졌을 때, 그 요소들이 최대 힙(Max Heap)의 조건을 만족하는지 확인해야 합니다.

최대 힙에서는 모든 부모 노드가 자신의 두 자식 노드보다 크거나 같은 값을 가져야 합니다. 따라서 어느 하나라도 자식 노드보다 작은 값이 존재한다면 해당 배열은 최대 힙이 아닙니다.

예를 들어 입력이 nums = [8, 6, 4, 2, 0, 3]이라면 출력은 True가 됩니다. 모든 요소가 자신의 자식들보다 큰 값을 가지고 있기 때문입니다.

파이썬으로 배열이 최대 힙(Max Heap) 형태인지 확인하는 방법

해결 접근 방법

배열 기반 힙에서는 인덱스 i에 있는 노드의 왼쪽 자식이 인덱스 2i+1, 오른쪽 자식이 인덱스 2i+2에 위치한다는 성질을 활용합니다. 이를 바탕으로 다음 단계로 문제를 해결할 수 있습니다.

  • n := 배열 nums의 크기
  • i를 0부터 n-1까지 반복:
    • m := i * 2
    • num := nums[i]
    • m + 1 < n이면서 num < nums[m + 1]이면 False 반환
    • m + 2 < n이면서 num < nums[m + 2]이면 False 반환
  • 모든 검사를 통과하면 True 반환

예제 코드

아래 파이썬 구현을 통해 동작 방식을 더 잘 이해할 수 있습니다.

def solve(nums):
    n = len(nums)
    for i in range(n):
        m = i * 2
        num = nums[i]
        if m + 1 < n:
            if num < nums[m + 1]:
                return False
        if m + 2 < n:
            if num < nums[m + 2]:
                return False
    return True

nums = [8, 6, 4, 2, 0, 3]
print(solve(nums))

입력

[8, 6, 4, 2, 0, 3]

출력

True

복잡도 분석

시간 복잡도: O(n) — 배열의 모든 요소를 한 번씩만 순회하여 확인합니다.
공간 복잡도: O(1) — 별도의 추가 메모리 없이 제자리에서 검사를 수행합니다.