https://www.acmicpc.net/problem/14929
14929번: 귀찮아 (SIB)
n과 xi가 주어짇나. n은 10만 이하ㅇ고, xi는 젗ㄹ댓값이 100이하인 정수디이다.
www.acmicpc.net
코드설명
누적합 문제입니다.
PrefixSum[N] 이란 N번쨰 인덱스까지의 합을 의미합니다.
미리 prefixSum을 구함을 통해 우리는 합 계산을 매번 구하지 않아도 됩니다.
문제의 그림을 보면 1<=a<b<=n 으로 시그마의 범위가 정해져있습니다. 해당 계산식에 맞게 해결하면됩니다.
예시를 그려보면,
x1(x2+x3) + x2(x3) 이 됩니다.
arr과 prefixSum 값을 표로 나타내보면,
arr
Index | 0 | 1 | 2 |
Value | +1 | -2 | +3 |
prefixSum
Index | 0 | 1 | 2 | 3 |
Value | 0 | +1 | -1 | +2 |
여기서 x2 + x3 을 구하려면 PrefixSum[3] - PrefixSum[2-1] 을 하면 1이 나옵니다.
PrefixSum[3] 은 arr[0] 부터 arr[2]까지의 전체 합을 의미하고, PrefixSum[1]은 arr[0]까지의 합을 의미합니다. 그러므로 arr[1] + arr[2]의 값이 나옵니다.
문제조건에, N은 10만 까지 가능하기에,
만약 값이 10만개로 입력되고, X의 최대값인 100으로 모든 값이 입력된다면, int 형의 범위가 넘어갑니다.
long 형으로 answer를 해줘야 자료형의 범위에 맞습니다.
문제에서 조금 헷갈릴 수 있는점은, arr과 prefixSum의 인덱스가 살짝 다릅니다.
prefixSum은 각 자리에서의 합을 의미하므로 N+1 만큼의 Size입니다.
즉, arr[0]까지의 누적합을 구하려면 prefixSum[0 + 1] 을 구해야합니다.
만약 arr[2]까지의 누적합을 구하려면 prefixSum[2 + 1] 을 구해야합니다.
또한, arr[1] + arr[2]의 합을 구하려면, arr[3] - arr[1] 을 구하면 됩니다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main { public static int N; public static int[] arr; public static int[] prefixSum; public static long answer = 0; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); arr = new int[N]; prefixSum = new int[N+1]; st = new StringTokenizer(br.readLine()); int sumValue = 0; for(int i=0;i<N;i++) { arr[i] = Integer.parseInt(st.nextToken()); sumValue += arr[i]; prefixSum[i + 1] = sumValue; } // for(int i=0;i<N+1;i++) { // System.out.println(" "+prefixSum[i]); // } for(int i=0;i<N;i++) { int standard = arr[i]; int calculatedSum = prefixSum[N] - prefixSum[i+1]; // System.out.println("standard:"+standard+" calcul"+calculatedSum); answer += standard * calculatedSum; } System.out.println(answer); } }
'알고리즘 > Prefix_Sum' 카테고리의 다른 글
[백준] 10986 나머지 합- 누적합(Prefix Sum) + 수학(나머지) JAVA (0) | 2023.08.13 |
---|---|
[백준] 1806 부분합 - 누적합(Prefix Sum) + 투포인터(Two Poitner) JAVA (0) | 2023.08.11 |
[백준] 21921 블로그 - 누적합(Prefix Sum) + 슬라이딩 윈도우(Sliding Window) JAVA (0) | 2023.08.06 |
[백준] 11660 구간 합 구하기 5 - 누적합(2차원, (Prefix Sum)) JAVA (0) | 2023.07.25 |
[백준] 2167 2차원 배열의 합 - 2차원 누적합(Prefix Sum) JAVA (0) | 2023.07.24 |