728x90
C 계열 언어를 쓰면 $O(N^2)$로 뚝딱 풀 수 있지만 파이썬으로 풀어보았다.
풀이
점과 점 사이 거리를 누적합으로 저장하면 $O(N)$으로 모든 쌍의 거리를 저장할 수 있다.
점들의 좌표들이 정렬된 배열 ar에서 $f(i - 1)$이 ar[i - 1]과 이전 점들의 거리 합을 나타낼 때 ar[i]와 이전 점들의 거리 합을 구하는 점화식은 $f(i) = f(i - 1) + (ar_{i} + ar_{i - 1}) \times i$이다.
i가 1씩 증가할 때마다 이전 점들과 ar[i] 사이의 거리를 구하기 위해 $(ar_{i} + ar_{i - 1})$를 지금까지 거쳤던 점들의 개수만큼 더해줘야 한다는 사실을 생각하면 $(ar_{i} + ar_{i - 1}) \times i$의 의미를 쉽게 이해할 수 있다.
누적합으로 이를 저장하고 loop를 돌려 누적합의 값을 모두 더한다. 문제에서는 $N^2$ 쌍의 거리 합을 구하라고 했으므로 더해준 값에 2를 곱한 값이 정답이다.
시간 복잡도는 정렬을 해야 하므로 $O(N \log N)$이다.
전체 코드 - 파이썬
더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import sys
n = int(sys.stdin.readline().rstrip())
ar = sys.stdin.readline().rstrip().split(' ')
prefixsum = []
for i in range(n):
ar[i] = int(ar[i])
prefixsum.append(0)
ar.sort()
for i in range(1, n):
prefixsum[i] = prefixsum[i - 1] + (ar[i] - ar[i - 1]) * i
res = 0
for i in prefixsum:
res += i
print(res * 2)
|
cs |
728x90
'백준 > DP' 카테고리의 다른 글
백준 17409 - 증가 수열의 개수 (0) | 2021.07.22 |
---|---|
백준 18249 - 욱제가 풀어야 하는 문제 (0) | 2021.07.19 |
백준 2315 - 가로등 끄기 (0) | 2021.03.12 |
[KOI] 백준 10835 - 카드게임 (0) | 2021.02.10 |
백준 1311 - 할 일 정하기 1 (0) | 2021.02.09 |