본문 바로가기
Python/알고리즘문제

[백준 2042] 구간 합 구하기

by 붕어사랑 티스토리 2022. 12. 27.
반응형

풀이

세그먼트 트리를 이용한다

 

구글에서 검색해서 나오는 세그먼트 트리 방법들은 arr에 index를 이용하여 구현하는데 나는 그게 싫어서 class안에다가 range를 넣었다. 그러고 나니 생각보다 코드가 깔끔하게 나왔다.

 

import sys


class Tree:
    def __init__(self, sum, range):
        self.sum = sum
        self.range = range
        self.left = None
        self.right = None


def makeTree(node, arr):
    if node.range[0] > node.range[1]:
        return 0
    if node.range[0] == node.range[1]:
        node.sum = arr[node.range[0]]
        return node.sum
    mid = int((node.range[0] + node.range[1])/2)
    if node.range[0] <= mid and mid <= node.range[1]:
        leftNode = Tree(0, [node.range[0], mid])
        rightNode = Tree(0, [mid+1, node.range[1]])
        node.left = leftNode
        node.right = rightNode
        node.sum = makeTree(leftNode, arr) + makeTree(rightNode, arr)
        return node.sum
    else:
        return 0


def getSum(node, start, end):
    if node.range[1] < start or node.range[0] > end:
        return 0
    elif start <= node.range[0] and node.range[1] <= end:
        return node.sum
    sum = getSum(node.left, start, end) + getSum(node.right, start, end)
    return sum


def update(node, index, diff):
    if index < node.range[0] or node.range[1] < index:
        return
    if node.range[0] <= index and index <= node.range[1]:
        node.sum += diff
    if node.left != None and node.right != None:
        update(node.left, index, diff)
        update(node.right, index, diff)


N, M, K = map(int, sys.stdin.readline().split())
arr = [0] * (N+1)
for i in range(1, N+1):
    num = int(input())
    arr[i] = num

root = Tree(0, [1, N])
makeTree(root, arr)

for _ in range(M + K):
    a, b, c = map(int, sys.stdin.readline().split())
    if a == 1:
        diff = c - arr[b]
        arr[b] = c
        update(root, b, diff)
    else:
        print(getSum(root, b, c))
반응형

'Python > 알고리즘문제' 카테고리의 다른 글

[알고스팟] 쿼드 트리 뒤집기  (0) 2023.01.06
[프로그래머스] 사칙연산  (0) 2022.12.28
[프로그래머스] 등대  (0) 2022.12.26
[알고스팟] 소풍  (0) 2022.12.21
[알고스팟] 보글게임  (0) 2022.12.21

댓글