• Codility lesson3_3 - TapeEquilibrium

    2021. 8. 15.

    by. 내이름은 킹햄찌

    요약

    벡터 A를 input 받아서 임의의 정수 P를 이용하여 A[0] ~ A[P-1]까지의 합과 A[P] ~ A[N]까지의 합의 차의 절댓값중 가장 적은 차이를 찾아라. P는 1~N이 될 수 있겠죠?

     

    아이디어

    1. 앞에서 부터 원소를 더해간 front_sum과 뒤에서 부터 원소를 더해온 reverse_sum을 구하여 front_sum[P-1] - reverse_sum[P]를 N만큼 연산하여 가장 적은 차를 구하면 된다.

     

    코드

     

    int solution(vector<int> &A) {
    	// write your code in C++14 (g++ 6.2.0)
    	vector<int> frond_sum(A.size());
    	vector<int> reverse_sum(A.size());
    	int min = 987654321;
    	int P = 0;
    	for (int i = 0; i < A.size(); i++)
    	{
    		if (i == 0)
    			frond_sum[i] = A[i];
    		else
    			frond_sum[i] = frond_sum[i - 1] + A[i];
    	}
    	for (int i = A.size() - 1; i >= 0; i--)
    	{
    		if (i == A.size()-1)
    			reverse_sum[i] = A[i];
    		else
    			reverse_sum[i] = reverse_sum[i + 1] + A[i];
    	}
    	for (int i = 1; i < A.size(); i++)
    	{
    		if (abs(frond_sum[i - 1] - reverse_sum[i]) < min) {
    			min = abs(frond_sum[i - 1] - reverse_sum[i]);
    		}
    	}
    	return min;
    
    }

    결과는

     

    front_sum과 reverse_sum 두개를 꼭 다 구해야할까? 라는 생각이 들어서 고민을 많이 했는데요

    front_sum만 구한뒤에 front_sum[N] - 2*front_sum[P]의 식으로 P를 0부터 차례로 증가시켜가며 해를 구하는 방법도 있을 수 있겠더라구요.

    예를 들어 a, b, c, d, e를 원소로 가지는 벡터배열에서

    (a+b+c+d+e) - 2(a)

    (a+b+c+d+e) - 2(a + b)

    (a+b+c+d+e) - 2(a + b + c)

    이해에 도움이 되셨나요??

     

    이런방법도 있다는 것을 참고 하시면 될것 같습니다.

    '알고리즘 > Codility' 카테고리의 다른 글

    Codility lesson4_2 - MaxCounters  (0) 2021.08.21
    Codility lesson4_1 - FrogRiverOne  (0) 2021.08.20
    Codility lesson3_2 - PermMissingElem  (0) 2021.08.15
    Codility lesson3_1 - FrogJmp  (0) 2021.08.15
    Codility lesson2_2 - OddOccurrencesInArray  (0) 2021.08.15

    댓글