알고리즘 문제풀이/백준

[백준 15954] 인형들

taemin 2021. 5. 11.

www.acmicpc.net/problem/15954

 

15954번: 인형들

첫 번째부터 세 번째까지의 인형을 선택하면 표준편차는 2/3의 양의 제곱근이 되고, 이 때 표준편차가 최소가 된다. 두 번째부터 네 번째까지의 인형을 선택하는 경우와, 세 번째부터 다섯 번째

www.acmicpc.net

from decimal import Decimal


N, K = map(int, input().split())
arr = list(map(int,input().split()))

sums = [0 for i in range(N+1)]
exps = [0 for i in range(N+1)]

for i in range(1, len(arr)+1):
    sums[i] = sums[i-1] + arr[i-1]
    exps[i] = exps[i-1] + arr[i-1] ** 2

re = Decimal('INF')

for i in range(K, N+1): # 즉 개수.
    for j in range(N-i+1):
        mean = Decimal(sums[i+j] - sums[j]) / i
        var = Decimal(exps[i+j] - exps[j]) / i - mean * mean
        re = min(re, var)

print(re.sqrt())

풀이

먼저 분산을 구하는 식을 알아야 한다.

분산은 식을 정리하면

분산 = 제곱의 평균 - 평균의 제곱이다.

고등학교때 배웠지만 나는 이 공식을 까먹어서 시간초과가 나 풀이를 참고했다.

 

제곱의 평균, 평균 둘다 누적합을 통해 빠르게 구할 수 있다.

구한것을 토대로 표준편차를 구하고 최솟값을 비교해 주면 된다.

 

참고 : 분산공식 유도

 

시간복잡도

O(N2)으로 풀기위해서는 누적합을 필수적으로 써야한다.

누적합을 이용해서 평균과 분산을 O(1)로 구한다.

평균과 분산을 O(N^2)번 구해야 하기 때문에 총 시간복잡도는 O(N^2) 이다.

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 1027] 고층 건물  (0) 2021.05.12
[백준 1004] 어린왕자  (0) 2021.05.12
[백준 1188] 음식 평론가  (0) 2021.05.11
[백준 17218] ⚾  (0) 2021.05.07
[백준 1013] Contact  (0) 2021.05.07

댓글