[Codility Lessons] Tape Equilibrium

Strawberry Oolong Tea·2022년 5월 24일
0

TODAY I LEARNED

목록 보기
49/51
post-thumbnail
post-custom-banner

숫자 배열에서 P를 기준으로 배열을 나누고 각 나뉜 부분의 합의 가장 작은 차이를 리턴하는 함수를 작성하는 문제입니다.

예를 들어,
[3, 1, 2, 4, 3] 다음과 같은 배열에서 P의 인덱스가 1이라고 할 때,
배열은 [3] [1, 2, 4, 3]으로 나뉩니다.
각 배열의 합은 310으로, 두 합의 차이는 7입니다.

[3], [1, 2, 4, 3] -> 3:10 -> 7
[3, 1] [2, 4, 3] -> 4:9 -> 5
[3, 1, 2] [4, 3] -> 6:7 -> 1
[3, 1, 2, 4] [3] -> 10:3 -> 7

따라서 가장 작은 차이는 1이 됩니다.

function solution(A) {
  // 
  let min = 2000;
  for (let i = 1; i < A.length; i++) {
    const head = A.slice(0, i).reduce((acc, cur) => acc + cur);
    const tail = A.slice(i).reduce((acc, cur) => acc + cur);
    if (min > Math.abs(head - tail)) {
      min = Math.abs(head - tail);
    }
  }
  return min;
}

채점 결과 퍼포먼스 테스트에서 모두 타임 에러가 발생했습니다.
시간복잡도는 O(N*N)입니다.

다른 풀이를 참고하여 전체 합에서 구하는 방식으로 다시 풀었습니다.

function solution(A) {
  let min = 2000;
  const arrSum = A.reduce((acc, cur) => acc + cur);
  let leftSum = A[0];
  let rightSum = arrSum - A[0];
  for (let i = 1; i < A.length; i++) {
    if (Math.abs(leftSum - rightSum) < min) {
      min = Math.abs(leftSum - rightSum);
    }
    leftSum += A[i];
    rightSum -= A[i];
  }
  return min;
}
profile
Der Vogel kämpft sich aus dem Ei 🥚🐣 목표를 위해 끊임없이 자신의 세계를 깨뜨릴 수 있는 용감한 개발자가 되고 싶습니다.
post-custom-banner

0개의 댓글