[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

+ Recent posts