본문 바로가기
PS/BOJ

백준 17550 자바 - Inquiry I (boj 17550 java)

by Nahwasa 2022. 4. 18.

문제 : boj17550

 

  prefix sum (누적합)을 안다면 쉽게 풀 수 있다.

누적합 배열을 하나는 n개를 원래 값 대로, 하나는 n개를 제곱해서 합한 누적합 배열을 만든다.

전자를 a, 후자를 b라고 하겠다.

 

  그럼 이후 특정 범위의 합을 O(1)로 알 수 있으므로,

b[i] * (a[n]-a[i])에 대해 i를 1부터 n까지 진행하면서 가장 큰 값을 찾으면 된다.

 

 

코드 : github

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    private void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int[] sum = new int[n+1];
        long[] powSum = new long[n+1];
        for (int i = 1; i <= n; i++) {
            int cur = Integer.parseInt(br.readLine());
            sum[i] = sum[i-1]+cur;
            powSum[i] = powSum[i-1]+cur*cur;
        }
        long max = 0;
        for (int i = 1; i <= n; i++) {
            max = Math.max(max, powSum[i] * (sum[n]-sum[i]));
        }
        System.out.println(max);
    }
    public static void main(String[] args) throws Exception {
        new Main().solution();
    }
}

댓글