HomePostAbout
thumbnail
Leetcode 561번 풀이
Algorithm
Leetcode
2022.09.13.

1. 문제 확인

561. Array Partition
n개의 짝에 min()함수를 적용한 후 합의 최댓값을 구하는 문제입니다. 얼핏 보면 어려워 보이지만 쉬운 문제입니다. 주어지는 배열(파이썬은 리스트)의 원소 개수는 2n으로 짝수인 것이 포인트입니다.

2. 코드

코드 1
처리시간 763ms

class Solution:
    def arrayPairSum(self, nums: List[int]) -> int:
        nums.sort()
        sum = 0
        i = 0
        
        while i < len(nums):
            sum += nums[i]
            i += 2

        return sum


코드 2 (개선)
처리시간 342ms

class Solution:
    def arrayPairSum(self, nums: List[int]) -> int:
        return sum(sorted(nums)[::2])

3. 피드백

코드 2는 단 한 줄로 문제를 해결합니다. 시간 복잡도는 두 코드 모두 O(n)으로 차이가 없습니다.

해당 문제의 기본 아이디어는 sort()입니다. 주어진 숫자들의 리스트를 정렬하게 되면 min() 에 들어가는 짝을 만들기 쉬워집니다. 저희의 목적은 min() 합의 최댓값을 구하는 것입니다. 간단히 생각하면 2개의 숫자 중 큰 수는 버려지고 작은 수만 남는데, 여기서 작은 수의 합이 최대가 돼야 합니다.

즉, 짝을 정할 때 큰 수와 작은 수의 차이가 작을수록 낭비되는 수가 없는 것입니다. 따라서 정렬된 상태에서 2개씩 순차적으로 숫자를 끊어주게 되면 최대한 작은 수의 합을 크게 만들 수 있습니다. ex.) [n, n+2, n+5, n+14] ➜ n+(n+5)가 가장 큰 수

추가적으로 코드 2의 경우 위의 원리를 반복문이 아닌 sum() 과 리스트 슬라이싱을 통해 구현했습니다. 따라서 속도가 비교적 빠르다고 볼 수 있습니다.

4. 요약정리

min() 합의 최댓값은 sort()를 응용해서 파티션을 만들자.
리스트 슬라이싱을 통해 홀수나 짝수 인덱스 값만 불러올 수 있다. list[start:end:step]

Source

Just an developer with drinks
2022 HyeonDong, Powered By Gatsby.