[Codility]Lesson15/CaterpillorMethod/MinAbsSumOfTwo

Mijeong Ryu·2023년 4월 23일
0

Codility

목록 보기
12/17

https://app.codility.com/demo/results/trainingE8GSWA-C6N/

문제

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:

class Solution { public int solution(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].
Copyright 2009–2023 by Codility Limited. All Rights Reserved. Unauthorized copying, publication or disclosure prohibited.

코드

import java.util.*;
class Solution {
    public int solution(int[] A) {
        Arrays.sort(A);
        int left = 0;
        int right = A.length-1;
        int sum = 0;
        int minVal = Integer.MAX_VALUE;
        while (left <= right){
            sum = A[right]+A[left];
            minVal = Math.min(Math.abs(sum),minVal);
            if(sum>0){
                right--;
            }
            else{
                left++;
            }
        }
        return minVal;
    }
}

풀이

음수, 양수를 고려하기 위해서 배열을 정렬한 후 시작한다.
sum 값이 0보다 작으면 sum값을 증가시키기 위해 left++를 하고
sum 값이 0보다 크면 sum값을 줄이기 위해 right --를 한다.
하면서 최소 절대값 minVal을 갱신한다.
while문제 left <= right에 부등호를 넣지 않으면
0,0 1,1 2,2와 같은 케이스는 고려되지 않아서 실패함!

0개의 댓글