반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

멋진 개발자가 되고 싶다

[LeetCode] 561. 배열 파티션 I(Array Partition I) 본문

Algorithm Study/leetcode

[LeetCode] 561. 배열 파티션 I(Array Partition I)

오패산개구리 2021. 6. 29. 11:41
728x90
반응형

n개의 페어를 이용한 min(a, b)의 합으로 만들 수 있는 가장 큰 수를 출력하라.

 

Input: nums = [1,4,3,2]

Output: 4

 

Explanation:

All possible pairings (ignoring the ordering of elements) are:

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

So the maximum possible sum is 4.

 

 

 

 

 

1. 내가 직접 푼 코드

 

1
2
3
4
5
6
7
8
class Solution:
    def arrayPairSum(self, nums: List[int]) -> int:
        result = 0
        nums.sort()
        print(nums)
        for i in range(len(nums)//2):
            result += min(nums[-(2*i+1)],nums[-(2*i+2)])
        return result
cs

 

해설:

 

nums를 정렬하고 값을 차례대로 min에 집어넣어 주면 되는 단순한 문제이다.

이해가 안되면 직접 넣어봐라!

사실 배열의 맨 앞부터 차례대로 min에 넣어도 되는데

입력값이 2의 배수로 들어온다는 것을 못 봐서 맨 뒤에부터 시작하도록 했다.

시험장에서는 문제의 세세한 조건까지도 따져보고 코드를 작성하자.

면접관이 왜 문제 자세히 안 봤냐고 뭐라 할 수도 있으니까.

 

 

 

 

 

 

** 깔끔한 답안 **

 

 

 

2. 오름차순 풀이

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
cs

 

해설:

 

pair라는 리스트를 만들어서 그 안에 2개가 차면 min을 구하는 식으로 진행했다.

나랑 결이 같은 코드지만 깔끔하다.

for문에 nums를 저런 식으로 이용하는 것을 생활화하자.

 

 

 

 

 

3. 짝수 번째 값 계산

 

 

1
2
3
4
5
6
7
8
9
10
11
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
cs

 

해설:

 

아이디어를 생각해내면 훨씬 더 단순해지는 것 같다.

사실문제에서 min을 쓰라는 느낌을 받아서 이 방식은 생각 못했을 것 같다.

코드는 간결한데 런타임 자체는 위와 비슷하다.

 

 

 

 

 

 

4. 파이썬다운 방식

 

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

 

해설:

 

결국엔 짝수를 더하는 거니까

정렬을 한 다음 슬라이싱으로 2칸씩 건너뛰면서 더하면 된다.

 

 

 

 

 

 

출처 : 파이썬 알고리즘 인터뷰 (글 : 박상길 그림 : 정진호) [책만]

728x90
반응형