문제링크 : https://www.acmicpc.net/problem/11659
11659번: 구간 합 구하기 4
첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j
www.acmicpc.net
작성코드
풀이
1) 기본 구현 방식
단순하게 i에서 j까지 리스트의 값들을 sum에 계속 저장해주는 방식이다.
하지만 이렇게 작성하면 시간 복잡도가 O(N*M)으로서 숫자가 커지게 되면 시간초과가 나오게 된다.
기본 방식으로 일정 구간 합을 구할 경우
10의 길이를 가진 arr 배열을 예시로 비교해보겠다.
arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ex) 3, 5 (3번째 수부터 5번째 수까지 합)
arr[2] 탐색
sum += arr[2] # sum = 2
arr[3] 탐색
sum += arr[3] # sum = 2+3 = 5
arr[4] 탐색
sum += arr[4] # sum = 5+4 = 9
이런 과정을 거쳐 계산이 완료된다.
1회만 계산한다면 상관이 없지만 매 계산마다 탐색과 sum 과정을 거치게 된다.
이를 해결하기 위해 누적합 알고리즘을 사용한다.
2) 구간합 알고리즘
구간합 알고리즘이란 주어진 배열의 일정 구간의 합을 구할 때 최적화하는 알고리즘이다.
구간 합 알고리즘으로 일정 구간 합을 구할 경우
ex) 3, 5 (3번째 수부터 5번째 수까지 합)
미리 배열의 합들을 계산해서 리스트에 누적합 값들을 저장해준다. (한번만 해두면 매번 계산과정이 필요하지 않게 된다.)
(sum에 저장해둠)
sum = [0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
sum[5] - sum[3] # 15 - 6 = 9
누적합에서 해당되지 않는 부분까지의 누적합을 빼면 구간합 계산과 동일하다.
'백준 > Python' 카테고리의 다른 글
[백준] 1912 연속합 (python 파이썬) (0) | 2022.11.27 |
---|---|
[백준] 9461 파도반 수열 (python 파이썬) (0) | 2022.11.27 |
[백준] 1149 RGB거리 (python 파이썬) (0) | 2022.11.16 |
[백준] 1904 01타일 (python 파이썬) (0) | 2022.11.14 |
[백준] 9184 신나는 함수 실행 (python 파이썬) (0) | 2022.11.09 |