본문 바로가기

Lesson 15. Caterpillar method - MinAbsSumOfTwo #1

반응형

1. 문제

Let A be a non-empty array consisting of N integers.
The abs sum of two for a pair of indices (P, Q) is the absolute value |A[P] + A[Q]|, for 0 ≤ P ≤ Q < N.
For example, the following array A:
A[0] = 1
A[1] = 4
A[2] = -3
has pairs of indices (0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2).
The abs sum of two for the pair (0, 0) is A[0] + A[0] = |1 + 1| = 2.
The abs sum of two for the pair (0, 1) is A[0] + A[1] = |1 + 4| = 5.
The abs sum of two for the pair (0, 2) is A[0] + A[2] = |1 + (−3)| = 2.
The abs sum of two for the pair (1, 1) is A[1] + A[1] = |4 + 4| = 8.
The abs sum of two for the pair (1, 2) is A[1] + A[2] = |4 + (−3)| = 1.
The abs sum of two for the pair (2, 2) is A[2] + A[2] = |(−3) + (−3)| = 6.

Write a function:
  int solution(vector<int> &A);

that, given a non-empty array A consisting of N integers, returns the minimal abs sum of two for any pair of indices in this array.
For example, given the following array A:
A[0] = 1
A[1] = 4
A[2] = -3
the function should return 1, as explained above.

Given array A:
A[0] = -8
A[1] = 4
A[2] = 5
A[3] = -10
A[4] = 3
the function should return |(−8) + 5| = 3.

Write an efficient algorithm for the following assumptions:
  - N is an integer within the range [1..100,000];
  - each element of array A is an integer within the range [−1,000,000,000..1,000,000,000].

 

두 수를 더했을 때, 가장 작은 절대값을 구하는 문제.

 

예시1) return 1

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

 

A[0] + A[0] = |1 + 1| = 2
A[0] + A[1] = |1 + 4| = 5
A[0] + A[2] = |1 + (−3)| = 2
A[1] + A[1] = |4 + 4| = 8
A[1] + A[2] = |4 + (−3)| = 1
A[2] + A[2] = |(−3) + (−3)| = 6

 

예시2) return 3

A[0] A[1] A[2] A[3] A[4]
-8 4 5 -10 3

A[0] + A[0] = |(−8) + (−8)| = 16
A[0] + A[1] = |(−8) + 4| = 4
A[0] + A[2] = |(−8) + 5| = 3

A[0] + A[3] = |(−8) + (−10)| = 18

A[1] + A[1] = |4 + 4| = 8
A[1] + A[2] = |4 + 5| = 9
A[1] + A[3] = |4 + (−10)| = 6
A[1] + A[4] = |4 + 3| = 7

A[2] + A[2] = |5 + 5| = 10
A[2] + A[3] = |5 + (−10)| = 5
A[2] + A[4] = |5 + 3| = 8

A[3] + A[3] = |(−10) + (−10)| = 20
A[3] + A[4] = |(−10) + 3| = 7

A[4] + A[4] = |3 + 3| = 6

 

2. 매개변수 조건

  • Vector A 크기: 1 ~ 100,000
  • Vector A 요소 값: -1,000,000,000 ~ 1,000,000,000

 

3. 코드 (C++)

전체탐색

int solution(vector<int> &A) {

    int min = numeric_limits<int>::max();

    for(size_t i = 0; i < A.size(); i++)
    {
        for(size_t j = i; j < A.size(); j++)
        {
            int sum = A[i] + A[j];
            if(sum < 0) sum *= -1;
            if(sum < min) min = sum;
        }
    }

    return min;
}

 

 

4. 결과

반응형