[백준] 15824: 너 봄에는 캡사이신이 맛있단다 - JAVA

https://www.acmicpc.net/problem/15824

풀이

매운 정도를 배열로 입력받아 몇 개를 선택하여 조합을 만들 경우 그 안에서 최댓값과 최솟값의 차이가 그 조합의 맛의 정도가 된다.

이런 맛의 정도들의 합을 구하는 문제이다.

먼저 입력받은 배열을 정렬했다.

i번째 인덱스의 경우 이 값이 최솟값이 되는 경우는 2^i개의 경우,

이 값이 최댓값이 되는 경우는 2^(N - i - 1)개의 경우가 된다.

2의 거듭제곱을 구하기 위해 분할정복을 이용했다.


메모리: 58472KB

시간: 792ms

언어: Java 11

코드

import java.util.*;
import java.io.*;

public class Main {
    static final int MOD = 1_000_000_007;
    static long[] dp;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[] arr = new int[N];
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(arr);

        dp = new long[N + 1];
        dp[0] = 1;
        long ans = 0;
        for (int i = 0; i < N; i++) {
            ans += arr[i] * pow(i);
            ans -= arr[i] * pow(N - i - 1);
            ans %= MOD;
        }

        System.out.println(ans);
    }

    public static long pow(int x) {
        if (dp[x] != 0) {
            return dp[x];
        }
        long half = pow(x / 2);
        if (x % 2 == 0) {
            return dp[x] = half * half % MOD;
        }
        return dp[x] = half * half * 2 % MOD;
    }

}