본문 바로가기
코딩 테스트

[Codility] Lesson3. TapeEquilibrium (C++)

by zoodi 2021. 2. 23.
728x90

🔮문제

A non-empty array A consisting of N integers is given. Array A represents numbers on a tape.

Any integer P, such that 0 < P < N, splits this tape into two non-empty parts: A[0], A[1], ..., A[P − 1] and A[P], A[P + 1], ..., A[N − 1].

The difference between the two parts is the value of: |(A[0] + A[1] + ... + A[P − 1]) − (A[P] + A[P + 1] + ... + A[N − 1])|

In other words, it is the absolute difference between the sum of the first part and the sum of the second part.

For example, consider array A such that:

A[0] = 3 A[1] = 1 A[2] = 2 A[3] = 4 A[4] = 3

We can split this tape in four places:

  • P = 1, difference = |3 − 10| = 7
  • P = 2, difference = |4 − 9| = 5
  • P = 3, difference = |6 − 7| = 1
  • P = 4, difference = |10 − 3| = 7

Write a function:

int solution(vector<int> &A);

that, given a non-empty array A of N integers, returns the minimal difference that can be achieved.

For example, given:

A[0] = 3 A[1] = 1 A[2] = 2 A[3] = 4 A[4] = 3

the function should return 1, as explained above.

Write an efficient algorithm for the following assumptions:

  • N is an integer within the range [2..100,000];
  • each element of array A is an integer within the range [−1,000..1,000].

🔮풀이

i 번재 인덱스까지 합한 값을 누적해서 다른 배열에 저장해두는 것이 포인트.

배열의 크기가 최대 100,000개 이므로 2중 포문을 도는 순간 시간복잡도가 O(N^2)이 되어버려 Timeout이 되어버린다.

배열의 크기 제한 n과 상한의 관계가 아래와 같다.

  • 배열의 크기 제한이 500이하인 경우 O(n^3)
  • 배열의 크기 제한이 10000이하인 경우 O(n^2)
  • 배열의 크기 제한이 백만 이하인 경우 O(n) 혹은 O(n log n)

따라서 이 문제는 O(N) 이하로 풀어야 정답이다.


🔮코드

#include <algorithm>
#include <iostream>
#include <vector>
/*
2개의 벡터로 split해서 2벡터의 합의 차가 가장 최소가 되는 값 리턴
*/

int check[100001] = {0};  //A벡터의 누적 합을 저장하는 배열

int solution(vector<int> &A) {
    int answer = 999999;
    int size = A.size();
    int total = 0;
    for(int i=0; i<size; i++){
        total += A[i];
        check[i] = total;
    }

    for(int i=0; i<size-1; i++){
        int val = total - check[i];  //한쪽배열의 합계
        int diff = abs(check[i]-val);
        if(answer > diff){
            answer = diff;
        }
    }
    return answer;
}
728x90

댓글