Dev.YoungKyu
YoungKyu's Devlog
전체 방문자
오늘
어제
  • 분류 전체보기
    • 부스트캠프
    • iOS
    • visionOS
    • Backend
    • 알고리즘
    • CS
    • Git
    • Python
    • 끄적끄적

블로그 메뉴

  • 홈
  • 🌝 티스토리 홈
  • ⭐️ 깃허브
  • 태그

공지사항

인기 글

최근 댓글

최근 글

태그

  • 알고리즘
  • if let
  • 티스토리챌린지
  • image
  • 백준
  • 부스트캠프
  • 소프트웨어 테스트
  • 오블완
  • constraint
  • Git
  • jekyll
  • SwiftUI
  • guard
  • Python
  • AutoLayout
  • Swift5.7
  • swift
  • ImageResource
  • boj
  • Optional
  • 소프트웨어 공학
  • MVC
  • authenticationinterceptor
  • alamofire
  • CS
  • Concurrency
  • ios
  • AVAudioSession
  • 소프트웨어공학
  • 모듈화

티스토리

hELLO · Designed By 정상우.
Dev.YoungKyu
[알고리즘] 구간 합, 누적 합(Prefix Sum)
알고리즘

[알고리즘] 구간 합, 누적 합(Prefix Sum)

2024. 3. 11. 16:34

목차

  • 누적 합이란?
  • 언제 사용할까?
  • 예시 및 코드

누적 합이란?

누적 합이란 수열 An에 대해서 각 인덱스까지의 구간의 합을 구하는 것을 누적 합이라고 합니다.

예를 들어 [1, 2, 3, 4, 5] 라는 배열이 있을 때, 각 구간까지의 합을 구하는 배열인 [ 1, 3, 6, 10, 15] 을 구한다고 가정해보면 아래와 같이 2가지로 구할 수 있습니다.

 

[ 첫번째 방법 ]
1
1+2
1+2+3
1+2+3+4
1+2+3+4+5
매번 현재 인덱스까지의 값을 반복하며 더해주기

[ 두번째 방법 ]
1
1+2
3+3
6+4
10+5
이전 인덱스까지의 누적합에 현재 값을 더해주기

 

 

어떤게 더 효율적일까요? 

배열의 갯수인 n을 늘려 [1, 2, ...,  99999, 10000]로 비교해보겠습니다.

 

[ 첫번째 방법 ]
1
1+2
1+2+3
...
1+2+...+9999
1+2+...+9999+10000
값을 구할때마다 n번 반복하니까 시간복잡도는 O(n^2) 가 되어 n이 큰 경우 사용할 수 없습니다.

[ 두번째 방법 ]
1
1+2
3+3
...
49985001+9999
49995000+10000
이전 인덱스까지의 합을 기억하고 있기 때문에 한번씩만 더해주면 되기에 시간복잡도는 O(N)이 됩니다.

 

 

언제 사용할까?

문제에서 Int 배열이 주어지고 어떠한 구간의 합을 구해야할 때 유용하게 사용할 수 있습니다.

 

 

예시 및 코드

위와 같은 배열이 주어지고 3번째 값부터 5번째 값까지의 구간 합을 구하는 예시를 들어보겠습니다.

 

우선 인덱스를 1부터 시작하도록 하기 위해 맨 처음에 0을 집어넣어 인덱스가 1부터 시작하도록 해줍니다.

 

누적 합을 저장할 배열을 만들고 값을 채워 줍니다.

 

 

3~5번 인덱스 값의 합은 1~5번 인덱스 값의 합 에서 필요없는 1~2번 인덱스값의 합을 빼주면 됩니다.

 

let input = [5, 3 , 11, 9, 12]

// 인덱스를 1부터 시작하도록 하기 위해
let array = [0] + input

// 누적 합
var prefixSum = Array.init(repeating: 0, count: array.count)
for i in 1..<array.count {
    prefixSum[i] = prefixSum[i-1] + array[i]
}

// 3~5번 인덱스 값의 합 = 1~5번 인덱스 값의 합 - 1~2번 인덱스 값의 합
let output = prefixSum[5] - prefixSum[2]

print(output) // 32

 

 

 

저작자표시 (새창열림)

'알고리즘' 카테고리의 다른 글

[백준] BOJ-14889 스타트와 링크  (0) 2022.11.27
[프로그래머스] PRG-JadenCase 문자열 만들기  (2) 2022.09.19
[백준 BOJ] BOJ -2309 일곱 난쟁이  (0) 2022.09.18
[백준 BOJ] BOJ-1018 체스판 다시 칠하기  (0) 2022.09.18
[백준 BOJ] BOJ-8393 합  (0) 2022.09.18
    '알고리즘' 카테고리의 다른 글
    • [백준] BOJ-14889 스타트와 링크
    • [프로그래머스] PRG-JadenCase 문자열 만들기
    • [백준 BOJ] BOJ -2309 일곱 난쟁이
    • [백준 BOJ] BOJ-1018 체스판 다시 칠하기
    Dev.YoungKyu
    Dev.YoungKyu
    iOS를 공부하고 있습니다

    티스토리툴바