파이썬으로 구현하는 구간합과 누적합(Prefix sum)

2024. 6. 1. 22:45·Algorithm/알고리즘 이론

구간합이란?

구간합이란, 나열된 숫자에서 특정 구간의 합을 말합니다.

 

만약 위의 arr에서 1~3번째 구간합을 구하고 싶다면, arr[1]+arr[2]+arr[3] = 4+3+2 = 9 입니다.

 

가장 기본적인 구간합 알고리즘을 생각해보면, 단순히  i~j번째까지의 값을 더하면 되고 이때 시간복잡도는 O(N)입니다.

하지만, 배열의 크기인 N이 매우 크고 구간합을 물어보는 쿼리가 N번이라면,

다음과 같이 O(N)*O(N) ≈  O(N^2)이라는 거듭제곱의 높은 시간복잡도를 가지는 알고리즘이 됩니다.

arr = list(map(int, input().split())) # 크기가 n개인 arr

for _ in range(N): # N 번의 쿼리 : O(N)
    i, j = map(int, input().split())
    sub_sum = sum(arr[i:j+1]) # i~j 번째의 구간합 : O(N)

 

 

 

누적합(Prefix sum)이란?

제곱의 시간복잡도를 가지는 구간합 문제를 누적합(Prefix sum)을 활용하면 O(N)으로 풀 수 있습니다.

먼저 누적합(Prefix sum)이란, 나열된 숫자의 누적된 합을 말합니다.

 

prefix_sum 배열을 활용하면, 다음과 같이 O(N) + O(N)*O(1) ≈ O(N) 선형 시간내에서 구간합을 구할 수 있습니다.

arr = list(map(int, input().split())) # 크기가 n개인 arr
prefix_sum = [0]

for i in range(len(arr)): # O(N)
    prefix_sum.append(prefix_sum[i]+arr[i])

for _ in range(N): # N 번의 쿼리 : O(N)
    i, j = map(int, input().split())
    sub_sum = prefix_sum[j] - prefix_sum[i-1] # i~j 번째의 구간합 : O(1)

 

 

다음 글에서는, O(N)보다 더 개선된 O(logN)으로 구간합을 구할 수 있는 세그먼트 트리에 대해서 알아보도록 하겠습니다.

https://codingsmu.tistory.com/176

 

파이썬으로 구현하는 세그먼트트리(Segment Tree)

https://codingsmu.tistory.com/175 파이썬으로 구현하는 구간합과 누적합(Prefix sum)구간합이란?구간합이란, 나열된 숫자에서 특정 구간의 합을 말합니다. 만약 위의 arr에서 1~3번째 구간합을 구하고 싶다

codingsmu.tistory.com

 

 

반응형

'Algorithm > 알고리즘 이론' 카테고리의 다른 글

파이썬으로 구현하는 세그먼트 트리(Segment Tree)  (0) 2024.06.01
[그래프 탐색] 파이썬으로 구현하는 DFS, BFS  (0) 2023.12.10
[문자열] 파이썬으로 구현한 유효한 팰린드롬(Palindrome)  (2) 2023.11.25
이진 탐색(Binary Search)과 매개변수 탐색(Parametric Search)  (0) 2022.03.18
[그래프 이론] 플로이드-워셜(Floyd-Warshall) 알고리즘  (0) 2022.01.02
'Algorithm/알고리즘 이론' 카테고리의 다른 글
  • 파이썬으로 구현하는 세그먼트 트리(Segment Tree)
  • [그래프 탐색] 파이썬으로 구현하는 DFS, BFS
  • [문자열] 파이썬으로 구현한 유효한 팰린드롬(Palindrome)
  • 이진 탐색(Binary Search)과 매개변수 탐색(Parametric Search)
계속지나가기
계속지나가기
NLP Engineer
  • 계속지나가기
    코딩스뮤
    계속지나가기
  • 전체
    오늘
    어제
    • 코딩스뮤:)
      • Algorithm
        • 백준 문제풀이
        • 프로그래머스 문제풀이
        • 알고리즘 이론
        • 자료구조
        • SW Expert Academy
      • 인공지능(AI)
        • LLMs
        • 자연어처리(NLP)
        • 컴퓨터비전(CV)
        • 딥러닝(DL)
        • 머신러닝(ML)
        • 인공지능기초수학
        • 선형대수학
      • 컴퓨터 세팅
      • Computer Science
        • 유닉스프로그래밍
        • 프로그래밍언어론
        • 디자인패턴
        • 클린코드
        • SW 영어
        • 리눅스
        • 논리회로
      • Server
        • Docker
      • 바이브 코딩
        • 클로드 코드
  • 블로그 메뉴

    • 홈
    • Who Am I(CV)
    • 태그
  • 링크

    • 깃허브 주소
  • 공지사항

  • 인기 글

  • 태그

    에지검출
    선형회귀
    ComputerVision
    디지털이미지처리
    비용함수
    f1-score
    machinelearning
    지도학습
    기계학습
    DigitalImageProcessing
    경사하강법
    SIFT
    패턴인식
    파이썬 클린코드
    머신러닝
    비지도학습
    손실함수
    컴퓨터비전
    최대유량
    ML
    NLP
    MaximumFlow
    알고리즘
    LM
    결정경계
    networkflow
    군집화
    DIP
    네트워크플로우
    언어모델
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
계속지나가기
파이썬으로 구현하는 구간합과 누적합(Prefix sum)

티스토리툴바