[JS] MinAvgTwoSlice
2022. 10. 27. 14:15
🔒 문제 (Codility)
Find the minimal average of any slice containing at least two elements.
For example, array A such that:
A[0] = 4 A[1] = 2 A[2] = 2 A[3] = 5 A[4] = 1 A[5] = 5 A[6] = 8
contains the following example slices:
- slice (1, 2), whose average is (2 + 2) / 2 = 2;
- slice (3, 4), whose average is (5 + 1) / 2 = 3;
- slice (1, 4), whose average is (2 + 2 + 5 + 1) / 4 = 2.5.
The goal is to find the starting position of a slice whose average is minimal.
🌊 입출력
A[0] = 4 A[1] = 2 A[2] = 2 A[3] = 5 A[4] = 1 A[5] = 5 A[6] = 8
the function should return 1, as explained above.
- N is an integer within the range [2..100,000];
- each element of array A is an integer within the range [−10,000..10,000].
🔑 해결
🌌 알고리즘
- 평균의 성질로 부분집합의 평균은 가장 작은 인자보다 항상 크다 - ex) (1, 2)의 평균은 1.5로 1보다 크다
- 평균 값들의 평균은 각 인자들의 평균과 같다 - ex) (1 ,2, 3, 4)에서 (1, 2)와 (3, 4)의 평균 1.5, 3.5의 평균은 2.5로 전체 평균과 같다.
- 위 두가지 성질로 인하여 가장 작은 평균을 가진 부분집합은 가장 작은 숫자를 포함한 인자가 2개 또는 3개인 slice만 확인하면 된다.
- 2개의 부분집합으로는 3개의 부분집합을 구할 수 없기 때문에 따로 고려한다 - ex) (2, 6, 1) = 3에서 (2, 6) = 4, (6, 1) = 3.5 인데 (4, 3.5) = 3.75
function solution(A) {
let min = (A[0] + A[1]) / 2;
let minIdx = 0;
for ( let i = 1; i < A.length - 1 ; i ++ ) {
let two = (A[i] + A[i + 1]) / 2;
if (i > A.length - 2) {
if ( two < min) {
min = two;
minIdx = i;
}
} else {
let three = (A[i] + A [i + 1] + A[i + 2]) / 3;
if (two < min || three < min) {
min = two < three ? two : three;
minIdx = i;
}
}
}
return minIdx;
}
'코딩테스트 (JS) > ETC' 카테고리의 다른 글
[JS] 숫자의 표현 (0) | 2022.11.14 |
---|---|
[JS] 파괴되지 않은 건물 (0) | 2022.10.30 |
[JS] 가장 큰 수 (0) | 2022.10.26 |
[JS] Zigzag Conversion (0) | 2022.10.26 |
[JS] Maximum Consecutive Floors Without Special Floors (0) | 2022.10.08 |