Algorithm/구현(Brute force, Back tracking, etc.)

[Codility - Arrays] TapeEquilibrium

쩡류 2021. 9. 17. 14:57
728x90

https://app.codility.com/programmers/lessons/3-time_complexity/tape_equilibrium/

 

TapeEquilibrium coding task - Learn to Code - Codility

Minimize the value |(A[0] + ... + A[P-1]) - (A[P] + ... + A[N-1])|.

app.codility.com

- Array의 element 최대 수는 200,000이다. 따라서, O(N^2)의 풀이법을 하면 당연히 시간초과가 날 것이다.

function solution(A) {
    let answer = Number.MAX_SAFE_INTEGER
    for(let i = 0; i < A.length; i++){
        let candid = 0;
        for(let j = 0; j <= i; j++){
            candid += A[j]
        }
        for(let j = i+1; j < A.length; j++){
            candid -= A[j]
        }
        answer = Math.min(answer, Math.abs(candid))
    }
    return answer
}

 

- 처음엔, 이리 저리 꼬아서 생각하다가 시간복잡도 신경쓰지 않고 풀어보기로 했고, 결국 Time out이 떴다.

 

- 곰곰히 생각하던 중, 전에 sliding window를 공부했던 기억이 나서, 이를 활용 해 보기로 했다.

 

function solution(A) {
    let firstNum = A[0]
    let secondNum = 0
    for(let i  = 1; i < A.length; i++){
        secondNum += A[i]
    }
    let answer = Math.abs(firstNum - secondNum)
    for(let i = 1; i < A.length-1; i++){
        firstNum += A[i]
        secondNum -= A[i]
        answer = Math.min(answer, Math.abs(firstNum - secondNum))
    }
    return answer
}

 

- 초기값은 처음 element 단 1개와, 나머지 모든 element들의 합으로 시작한다.

- 이후 element들을 순서대로 순회하면서 firstNum에는 해당 element를 더해주고, secondNum에는 해당 element를 빼주면 O(N)으로 풀어낼 수 있게 된다.