7장_10 배열(배열 파티션1)

김동민·2021년 10월 6일

배열중 2개의 min(a,b)를 만들어 합이 제일 큰 수를 출력하라.

1,4,3,2의 배열이 있고 이중 2개씩 뽑아 min(a1,b1) min(a2,b2)를 만들어 나온 두 수의 합이 제일 큰 수를 출력하라라는 문제이다.

1. 오름차순 풀이

문제를 처음 보고 생각했을 때는 복잡한 문제로 보였는데 풀이를 보니 너무나 간단했다.
결국 2개의 값을 뽑아 2쌍의 min을 만드는데 2개의 값중 작은 값끼리 더하는 것이니 되도록이면 min()값이 커야 한다는 것이 중요했다.
그러면 배열을 내림차순으로 정렬하여 집어 넣으면 항상 최대의 min()값을 유지할 수 있단 뜻이다.

from typing import List


class Solution:
    def arrayPairSum(self, nums: List[int]) -> int:
        sum = 0
        pair = []
        nums.sort()

        for n in nums:
            # 앞에서 부터 오름차순으로 페어를 만들어 합 계산
            pair.append(n)
            if len(pair) == 2:
                sum += min(pair)
                pair = []

        return sum

2. 짝수 번째 값 계산

페어에 일일이 min()값을 구하지 않고 짝수 번째 값끼리 더해도 위와 같은 결과가 나올 것이다.
짝수인 이유는 0부터 시작하기 때문이다.

from typing import List


class Solution:
    def arrayPairSum(self, nums: List[int]) -> int:
        sum = 0
        nums.sort()

        for i, n in enumerate(nums):
            # 짝수 번째 값의 합 계산
            if i % 2 == 0:
                sum += n

        return sum

3. 파이썬다운 방식

파이썬의 슬라이싱을 활용하면 한줄이면 되는 더욱 간단한 문제로 된다.

from typing import List


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

슬라이싱을 2칸씩 건너 뛰므로 짝수 번째를 계산하는 방식과 동일하다.

profile
틀리면 당신이 맞습니다... 개발하며 얻은 지식창고

0개의 댓글