본문 바로가기

Algorithm/문제풀이

Codility Lesson5 - MinAvgTwoSlice

🔍 문제


 

 

MinAvgTwoSlice coding task - Learn to Code - Codility

Find the minimal average of any slice containing at least two elements.

app.codility.com

 

✏️ 풀이 - JS


아무리 생각해도 이중 for문으로 배열을 일일히 순회하면서 값을 찾는 방법 밖에는 떠오르지 않는다. 왜 나는 항상 for문으로 푸는게 가장 먼저 생각나는 걸까... 후...

 

 

하지만 timeout error가 나올 것이 뻔하므로 다른 방법을 떠올리려 했지만 아무리 생각해도 떠오르지가 않아 구글 선생님의 도움을 받아 풀어보았다.

문제는 아래를 참고해서 풀면된다. 검색 안했으면 아마 풀지 못했을 것 같다. 하나 배웠다 😎 크크

  • 어떤 수 n, m이 있고, n <= m 일 경우, 두 수의 평균은 n보다 항상 크거나 같다.
  • 마찬가지로, 원소 n, m, o, p 가 있고 (n + m) <= (o + p)일 경우 네 수의 평균은 (n + m)보다 크다.
  • 따라서, 원소가 4개 이상인 경우는 생각하지 않고 2개, 3개인 경우로 나눠서 생각하면된다!

시간복잡도는 O(N)으로 나왔고 정확도, 효율성 모두 100%로 나왔다.

function solution(A) {
    let min; //최소 Avg
    let minP; //최소 P
    let tmp; //임시 변수

    for(i = 0; i < A.length-1; i++) {    
        //원소 2개
        if(i < A.length-1){
            if(i === 0) { //첫번째 최소값 셋팅
                min = (A[i] + A[i+1]) / 2; 
                minP = i;
            } else {
                tmp = (A[i] + A[i+1]) / 2;

                if(tmp < min) {
                    min = tmp;
                    minP = i;
                } else if ( tmp === min ) { //최소 평균값과 같을 경우
                    if(i < minP) minP = i;
                }
            }
        }

        //원소 3개
        if(i < A.length-2){
            tmp = (A[i] + A[i+1] + A[i+2]) / 3;

            if(tmp < min) {
                min = tmp;
                minP = i;
            } else if (tmp === min) { //최소 평균값과 같을 경우
                if(i < minP) minP = i;
            }
        }
    }

    return minP;
}

'Algorithm > 문제풀이' 카테고리의 다른 글

Codility Lesson6 - MaxProductOfThree  (0) 2019.08.09
Codility Lesson5 - CountDiv  (0) 2019.08.08
Codility Lesson5 - GenomicRangeQuery  (0) 2019.08.07
Codility Lesson5 - PassingCars  (0) 2019.08.07
Codility Lesson4 - MissingInteger  (0) 2019.08.07