Codility Lesson3. Time Complexity - TapeEquilibrium ★

세나정·2023년 4월 24일
0
post-thumbnail

Tasks

N개의 정수로 구성된 비어 있지 않은 배열 A가 제공됩니다. 배열 A는 테이프의 숫자를 나타냅니다.

0 < P < N과 같은 임의의 정수 P는 이 테이프를 비어 있지 않은 두 부분으로 나눕니다: A[0], A[1], ..., A[P − 1] 및 A[P], A[ P + 1], ..., A[N - 1].

두 부분의 차이 는 |(A[0] + A[1] + ... + A[P − 1]) − (A[P] + A[P + 1] + .. . + A[N - 1])|

즉, 첫 번째 부분의 합과 두 번째 부분의 합 사이의 절대 차이입니다.

예를 들어 다음과 같은 어레이 A를 고려하십시오.

A[0] = 3
A[1] = 1
A[2] = 2
A[3] = 4
A[4] = 3
이 테이프를 네 곳으로 나눌 수 있습니다.

P = 1, 차이 = |3 − 10| = 7
P = 2, 차이 = |4 − 9| = 5
P = 3, 차이 = |6 − 7| = 1
P = 4, 차이 = |10 − 3| = 7
함수 작성:

기능 솔루션(A);

N 정수의 비어 있지 않은 배열 A가 주어지면 달성할 수 있는 최소 차이를 반환합니다.

예를 들면 다음과 같습니다.

A[0] = 3
A[1] = 1
A[2] = 2
A[3] = 4
A[4] = 3
함수는 위에서 설명한 대로 1을 반환해야 합니다.

다음 가정에 대한 효율적인 알고리즘을 작성하십시오 .

N은 범위 [ 2 .. 100,000 ] 내의 정수이고;
배열 A의 각 요소는 [ −1,000 .. 1,000 ] 범위 내의 정수입니다.

내 풀이

// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');

function solution(A) {

    // const, let처럼 확실하게 범위지정해주기
    
    const 전체합 = A.reduce( (a,c) => a+=c, 0)
    let 왼쪽합 = 0
    let 오른쪽합 = 0
    let mindiff = Number.MAX_SAFE_INTEGER

    for (i=1; i<A.length; i++) {
    
    	// for의 범위가 1부터 시작하고 A[i-1]인 이유는
		// 오른쪽이 전체가 되는 것이 아닌 왼쪽합의 값이 1개는 가지고 있어야 하기 때문에
        
        왼쪽합 += A[i-1];
        오른쪽합 = 전체합-왼쪽합;

        mindiff = Math.min(Math.abs(오른쪽합-왼쪽합), mindiff)
    }

    return mindiff

}

다른 사람 풀이

// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');

function solution(A) {
    // write your code in JavaScript (Node.js 8.9.4)
    const N = A.length;
    const totalSum = A.reduce((a, b) => a + b);
    let leftSum = A[0];
    let rightSum = totalSum - A[0];
    let minDiff = Number.MAX_SAFE_INTEGER;
    let diff;

    for(let P=1; P<N; P++){
        diff = Math.abs(leftSum - rightSum);
        if(diff < minDiff){
            minDiff = diff;
        }
        leftSum += A[P];
        rightSum -= A[P];
    }

    return minDiff;
}

다른 사람도 마찬가지로 왼쪽합, 오른쪽합, minDiff를 다 구해준 다음
왼쪽과 오른쪽이 [0]부터 시작하니 A[1] 더하기를 시작하였다.
그후 diff란 변수를 통해 가장 최소인 값을 넣어주고 그 값을 반환

profile
기록, 꺼내 쓸 수 있는 즐거움

0개의 댓글