개발관련/매일 코딩 테스트 챌린지

[코딜리티] MinAvgTwoSlice (javascript)

2020. 8. 25. 11:29
반응형

 

문제 출처

문제 요약

A non-empty array A consisting of N integers is given. A pair of integers (P, Q), such that 0 ≤ P < Q < N, is called a slice of array A (notice that the slice contains at least two elements). The average of a slice (P, Q) is the sum of A[P] + A[P + 1] + ... + A[Q] divided by the length of the slice. To be precise, the average equals (A[P] + A[P + 1] + ... + A[Q]) / (Q − P + 1).

임의로 배열을 slice 해서 각 요소의 평균값을 구하고 평균값이 최소인 경우의 index 를 return 한다.

최소한 2개이상 원소를 slice 한다

문제 풀이

function solution(A) {
    let minIndex = 0;
    let minAvg = (A[0] + A[1]) / 2;

      for (let i = 0; i < A.length - 1; i++) {
        let sum = A[i];
        for (let j = i + 1; j < A.length; j++) {
          sum += A[j];
          const avg = sum / (j - i + 1);
          if (minAvg > avg) {
            minAvg = avg;
            minIndex = i;
          }
        }
      }

      return minIndex;
}

성능 상관없이 풀어봄.

당연히 Performance 에서 실패.

이 문제는 도저히 못 풀겟어서 구글의 힘을 빌렸다.

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;
}

결론

더보기

결론적으로 2가지 케이스만 고려하면 된다. slice가 2개 또는 3개인 경우이다. 평균의 성질로 부분집합의 평균은 가장 작은 인자보다 항상 크다. 즉, (1, 2)의 평균은 1.5이므로 1보다 크다는 의미이다.

또한, 평균들의 평균은 각 인자들의 평균과 같다. 즉, (1, 2, 3, 4)가 있을 때, (1, 2, 3, 4) = 2.5이고 (1, 2) = 1.5, (3, 4) = 3.5 일 때 (1.5, 3.5) = 2.5가 된다는 의미이다.

위 2가지 성질을 생각하였을 때 인자의 수가 4개 이상인 것은 고려할 필요가 없다. 가장 작은 평균을 가지는 부분집합은 가장 작은 숫자를 포함한 2개 또는 3개의 인자만 생각하면 된다.

3개의 인자를 고려하는 것은 2개의 부분집합으로는 3개의 부분집합을 구할 수 없기 때문이다. 가령 (1, 5, 2)가 있을 때, (2, 6, 1) = 3이고, (2, 6) = 4, (6, 1) = 3.5 일 때 (4, 3.5) = 3.75가 됨으로 3개의 경우는 따로 생각해야 한다.

기본적으로 수학적 지식이 있으면 좋았을 문제.

반응형

'개발관련 > 매일 코딩 테스트 챌린지' 카테고리의 다른 글

[코딜리티] MaxProductOfThree (JavaScript)  (0) 2020.08.28
[프로그래머스] 시저 암호 (JavaScript)  (0) 2020.08.26
[프로그래머스] 수박수박수박수박수박수? (javascript)  (0) 2020.08.24
[코딜리티] GenomicRangeQuery (javascript)  (0) 2020.08.24
[JAVASCRIPT] 코딜리티 CountDiv  (0) 2020.08.23
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
개발자 Dane
개발자 Dane
IT / 테크 전문 크리에이터 데인 입니다.
개발자 Dane
개발자 Dane의 IT 전문 블로그
개발자 Dane
반응형
  • 분류 전체보기 (170)
    • 개발관련 (24)
      • 프론트엔드 지식 (11)
      • 매일 코딩 테스트 챌린지 (27)
      • 자바스크립트 팁 (32)
      • 리액트 (11)
    • 얼리어답터 (11)
    • 팁 (13)
    • 게임 (18)
      • 디아블로2레저렉션 (16)
    • 운동하는 후니 (2)
전체
오늘
어제

태그

  • 코딩테스트
  • 도커
  • 자바스크립트
  • 디아블로4
  • vscode
  • 문자열정렬
  • 갤럭시성능뻥튀기
  • 리액트
  • 레저렉션
  • gos
  • javascript
  • docker
  • React
  • 룬워드방패
  • GOS해제
  • 문자열
  • 갤럭시소비자기만
  • 애플페이
  • yarn
  • s3
  • 디아블로2레저렉션
  • 디아블로2
  • 바바리안
  • AWS
  • 프로그래머스
  • Next.js
  • 갤럭시긱벤치
  • 아이폰
  • PNP
  • Gatsby

최근 댓글

hELLO · Designed By 정상우.
개발자 Dane
[코딜리티] MinAvgTwoSlice (javascript)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.