일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 카카오
- 이분탐색
- heapq
- divmod
- 프로그래머스
- Set
- 재귀함수
- BFS
- 동적 계획법
- 수학
- DateTime
- 위클리 챌린지
- 자바
- Re
- programmers
- Combinations
- python
- 파이썬
- lambda
- 정규식
- 다익스트라
- dfs
- java
- KAKAO BLIND RECRUITMENT
- 그리디
- 정렬
- 백준
- 추석맞이 코딩챌린지
- Zip
- backjoon
Archives
- Today
- Total
상상쓰
[백준] 인형들 본문
https://www.acmicpc.net/problem/15954
K 이상의 연속된 인형의 값의 표준편차 중 가장 작은 값을 반환하면 되는 문제다.
반목문을 통하여 구한 K 이상의 길이의 배열들의 표준편차를 구할 때 필요한 평균 또는 분산의 값들은 누적 합을 통하여 새로이 정의된 배열을 통해서 구한다. (시간 초과 방지)
sumDolls[][0] 은 누적 합이며, sumDolls[][1] 은 누적 제곱합이다.
m(평균) = (sumDolls[end][0] - sumDolls[start][0]) / (end - start)(= k)
v(분산) =
(v1 - m)^2 + (v2 - m)^2 + ... + (vk - m)^2 = v1^2 * v2^2 * ... * vk^2 - 2 * (v1 + v2 + ... + vk) * m + k * m^2
=
sumDolls[end][1] - sumDolls[start][1] - 2 * (m * k) * m + k * m^2
=
sumDolls[end][1] - sumDolls[start][1] - k * m^2
상대/절대 오차를 고려하여 python 에서는 float 형이 아닌 decimal.Decimal 을 이용한다.
import sys, math
from decimal import Decimal
N, K = map(int, sys.stdin.readline().split())
dolls = list(map(Decimal, sys.stdin.readline().split()))
answer = Decimal('inf')
e1, e2 = 0, 0
sumDolls = []
for i in dolls:
e1 += i
e2 += (i * i)
sumDolls.append((e1, e2))
for k in range(K, N+1):
for i in range(N-k+1):
m = (sumDolls[k+i-1][0] - (sumDolls[i-1][0] if i-1 >= 0 else 0)) / Decimal(k)
v2 = sumDolls[k+i-1][1] - (sumDolls[i-1][1] if i-1 >= 0 else 0)
answer = min(math.sqrt((v2 - (m * k * m)) / Decimal(k)), answer)
print(answer)
'Coding Test' 카테고리의 다른 글
[추석맞이 코딩챌린지①] 피보나치수 (0) | 2021.09.19 |
---|---|
[프로그래머스] 금과 은 운반하기 (0) | 2021.09.17 |
[백준] 어린 왕자 (0) | 2021.09.15 |
[백준] 최소공배수 (0) | 2021.09.14 |
[백준] 파도반 수열 (0) | 2021.09.14 |
Comments