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

처음 아이디어는 nCr마냥 각 조합별 최솟값, 최댓값을 구하고, 해당 최솟값 최댓값의 차를 그 조합수 만큼 곱하여 주헌고통지수 합을 구했었는데 3중 for문과, nCr 조합 수를 for문으로 구하는 그 시간 때문에 시간 초과 문제가 있었다.
그래서 알아보다가 밑의 블로그 글의 힌트를 참고했다.
[백준] 15824 - 너 봄에는 캡사이신이 맛있단다 힌트, 풀이 및 코드(C++)
https://www.acmicpc.net/problem/15824 15824번: 너 봄에는 캡사이신이 맛있단다 한 줄에 모든 조합의 주헌고통지수 합을 1,000,000,007로 나눈 나머지를 출력한다. www.acmicpc.net 1. 문제 - 첫 줄에 메뉴의 종류 $N$
cding.tistory.com


즉, 정렬된 리스트를 for문으로 순환하면서 최솟값 A[idx], 최댓값 A[N-1 - idx]는 각각 $2^{N-1}-1$번씩 곱하고 각각 빼고 더하면 된다는 것이다.
저번 1629번 문제에서, 큰 수를 다룰 때 미리 나눔으로써 시간 초과 문제를 다뤘었는데, 이번에도 최솟값의 합, 최댓값의 합을 미리 나눠야 하는 1000000007로 나누었다.
2의 거듭제곱 또한 미리 계산하고 1000000007로 나누어주었다.
# https://www.acmicpc.net/problem/15824
# 수학, 조합론
import sys
N = int(input())
scovs = list(map(int, sys.stdin.readline().split()))
scovs.sort()
div = 1000000007
square2 = [0 for _ in range(N)]
temp = 1
for idx in range(N) :
square2[idx] = temp - 1
temp *= 2
temp %= div
minimums = 0
maximums = 0
for idx in range(N) :
minimums += square2[N-1 - idx] * scovs[idx]
maximums += square2[N-1 - idx] * scovs[N-1 - idx]
minimums %= div
maximums %= div
print((maximums%div - minimums%div)%div)'코테풀이 > 백준' 카테고리의 다른 글
| 2839번: 설탕 배달 (0) | 2025.11.20 |
|---|---|
| 16565번: N포커 (0) | 2025.11.03 |
| 1629번: 곱셈 (0) | 2025.10.27 |
| 13334번: 철로 (0) | 2025.10.18 |
| 2170번: 선 긋기 (0) | 2025.10.18 |