Algorithm/릿코드(leetcode)

[릿코드] 561번 : Array Partition I

jalha 2021. 4. 28. 22:50

leetcode.com/problems/array-partition-i/

 

Array Partition I - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 


문제

2배수길이의 배열이 주어진다.

두개씩 짝지었을때 작은 값들의 최대 합을 구하라

EX) [1,4,3,2]

1. (1, 4), (2, 3) -> min(1, 4) + min(2, 3) = 1 + 2 = 3

2. (1, 3), (2, 4) -> min(1, 3) + min(2, 4) = 1 + 2 = 3

3. (1, 2), (3, 4) -> min(1, 2) + min(3, 4) = 1 + 3 = 4 

=> 답 : 4

 

어떻게 풀까?

sort를 하고 제일 작은거 두개씩 묶는다 

-> 두 수의 차이가 작아야 버리는 숫자가 작다. 따라서 sort하고 순서대로 묶는것! 버리는 숫자를 작게하기위해 이렇게 생각하게 되었다.

 

0,2,4,... 인덱스를 더하면 끝!

 

구현 중 만난 문제/해결

IntStream을 사용해 풀어봤다.

 

구현

 

class Solution {
    public int arrayPairSum(int[] nums) {
        Arrays.sort(nums);

        Optional<Integer> result = IntStream
                .range(0, nums.length)
                .filter(i -> i % 2 == 0)
                .mapToObj(i -> nums[i])
                .reduce((x, y) -> x + y);

        return result.get();
    }
}

 

더 나은 방식

 

구현한 방식과 방법은 같지만 intstream을 안쓴방식이다. 구현한것은 15ms가 걸렸지만 아래는 10ms가 걸린다.

 

class Solution {
    public int arrayPairSum(int[] nums) {
        Arrays.sort(nums);
        int sum = 0;
        for (int i = 0; i < nums.length; i += 2) {
            sum += nums[i];
        }
        return sum;
    }
}