배열중 2개의 min(a,b)를 만들어 합이 제일 큰 수를 출력하라.
1,4,3,2의 배열이 있고 이중 2개씩 뽑아 min(a1,b1) min(a2,b2)를 만들어 나온 두 수의 합이 제일 큰 수를 출력하라라는 문제이다.
문제를 처음 보고 생각했을 때는 복잡한 문제로 보였는데 풀이를 보니 너무나 간단했다.
결국 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

페어에 일일이 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

파이썬의 슬라이싱을 활용하면 한줄이면 되는 더욱 간단한 문제로 된다.
from typing import List
class Solution:
def arrayPairSum(self, nums: List[int]) -> int:
return sum(sorted(nums)[::2])
슬라이싱을 2칸씩 건너 뛰므로 짝수 번째를 계산하는 방식과 동일하다.
