구간 합은 합 배열을 이용하여 시간 복잡도를 더 줄이기 위해 사용하는 특수한 목적의 알고리즘 이다. 코딩 테스트에서 사용 빈도가 높기 때문에 알아두면 좋다.
구간 합은 누적합이라고도 하는데, C#으로 누적합을 정리해둔 글이 있으니 참고해도 좋을것 같다.
해당 게시글엔 2차원 배열의 누적합도 정리해 두었다.
[알고리즘] 누적합 (Prefix Sum)
누적합(Prefix Sum)은 배열 또는 리스트 등에서 일정 구간의 합을 빠르게 계산하기 위한 방법이면서 동적 계획법(DP)의 형태 중 하나이다.기본적인 방식은 각 요소까지의 누적합을 계산하여 이를 배
twd0622.tistory.com
구간 합 이론
구간 합 알고리즘을 활용하려면 먼저 합 배열을 구해야한다.
배열 arr이 있을 때 합 배열 sumArr은 다음과 같다.
// arr[0] 부터 arr[i]까지의 합
SumArr[i] = arr[0] + arr[1] + arr[2] + ... + arr[i-1] + arr[i]
합 배열은 기존 배열을 이용해 만든 배열이다. 합 배열을 미리 구해 놓으면 기존 배열의 일정 범위 합을 구하는 시간 복잡도가 O(N)에서 O(1)로 감소한다.
합 배열을 만드는 공식
sumArr[i] = sumArr[i-1] + arr[i]
// 배열 arr
int[] arr = {15, 13, 7, 23, 4, 11, 31, 10, 2, 19};
// 합 배열 만들기
sumArr[0] = arr[0];
for(int i = 1; i < arr.length; i++){
sumArr[i] = sumArr[i-1] + arr[i];
}
이렇게 구현된 합 배열을 이용하여 구간 합을 쉽게 구할 수 있다. i에서 j까지 구간 합을 구하는 공식은 다음과 같다.
구간합을 구하는 공식
sumArr[j] - sumArr[i-1]
// 인덱스 2부터 4까지
sumArr[4]-sumArr[1]
이렇게 합 배열과 구간 합 공식을 사용하면 코딩 테스트에서 시간 복잡도를 줄이는데 도움이 된다.
합 배열을 만들고 구간합을 구하는 전체 코드
int[] arr = {15, 13, 7, 23, 4, 11, 31, 10, 2, 19};
int[] sumArr = new int[arr.length];
// 합 배열 만들기
sumArr[0] = arr[0];
for(int i = 1; i < arr.length; i++){
sumArr[i] = sumArr[i-1] + arr[i];
}
// 인덱스 2부터 4까지
System.out.println(sumArr[4]-sumArr[1]);
# 출력 결과
34
관련 문제
[JAVA][백준][S1] 구간 합 구하기 5
https://www.acmicpc.net/problem/11660 📒 문제N×N개의 수가 N×N 크기의 표에 채워져 있다. (x1, y1)부터 (x2, y2)까지 합을 구하는 프로그램을 작성하시오. (x, y)는 x행 y열을 의미한다.예를 들어, N = 4이고, 표
twd0622.tistory.com
[JAVA][백준][G3] 나머지 합
https://www.acmicpc.net/problem/10986📒 문제수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오. 즉, Ai + ... + Aj (i ≤ j)
twd0622.tistory.com
내용 출처
Do it! 알고리즘 코딩 테스트: 자바 편 | 김종관
'코딩 테스트 > 코딩 테스트 [JAVA]' 카테고리의 다른 글
| [JAVA] 형 변환 (0) | 2025.10.20 |
|---|---|
| [JAVA] 이차원 ArrayList로 그래프 표현 (0) | 2025.10.20 |
| [JAVA] 다중 조건 정렬 (Comparable, Comparator) (0) | 2025.10.17 |
| [알고리즘] 나누기 연산의 분배 법칙 (0) | 2025.10.15 |
| [알고리즘] 인덱스 해싱 (0) | 2025.10.15 |