계속지나가기
코딩스뮤
계속지나가기
전체 방문자
오늘
어제
  • 코딩스뮤:)
    • Algorithm
      • 백준 문제풀이
      • 프로그래머스 문제풀이
      • 알고리즘 이론
      • 자료구조
      • SW Expert Academy
    • 인공지능(AI)
      • LLMs
      • 자연어처리(NLP)
      • 컴퓨터비전(CV)
      • 딥러닝(DL)
      • 머신러닝(ML)
      • 인공지능기초수학
      • 선형대수학
    • 컴퓨터 세팅
    • Computer Science
      • 유닉스프로그래밍
      • 프로그래밍언어론
      • 디자인패턴
      • 클린코드
      • SW 영어
      • 리눅스
      • 논리회로
    • Server
      • Docker

블로그 메뉴

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

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
계속지나가기
Algorithm/알고리즘 이론

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

파이썬으로 구현하는 구간합과 누적합(Prefix sum)
Algorithm/알고리즘 이론

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

2024. 6. 1. 22:45
반응형

구간합이란?

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

 

만약 위의 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
  • 구간합이란?
  • 누적합(Prefix sum)이란?
'Algorithm/알고리즘 이론' 카테고리의 다른 글
  • 파이썬으로 구현하는 세그먼트 트리(Segment Tree)
  • [그래프 탐색] 파이썬으로 구현하는 DFS, BFS
  • [문자열] 파이썬으로 구현한 유효한 팰린드롬(Palindrome)
  • 이진 탐색(Binary Search)과 매개변수 탐색(Parametric Search)
계속지나가기
계속지나가기
NLP Engineer

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.