[Swift] [60일차] 1561_LEET 코인

·2025년 2월 5일
0

SwiftAlgorithm

목록 보기
63/105
post-thumbnail

1561. Maximum Number of Coins You Can Get


문제 설명

  1. 배열이 주어진다 3n길이 ( 3엔빵가능한 길이)
  2. 그걸 3개의 튜플로 만들어서 중간값을 내가 가질건데,
  3. 그 값의 합이 가장 크도록해서 합을 return

문제 접근

  1. 결국엔 중간값만 잘 더해주면될 듯
  2. 이전에 활용했던 left,right 활용해서 각길이 n만큼 전체 합에서 빼주면 될 것 같다.

라고 생각해서

while left < N {
            sum = sum - (piles[left] + piles[right])
            left += 1
            right -= 1
        }

다음과 같이 중간값을 구하기 위해서 이렇게 차근차근 들어오면서 sum에서 전부다 빼주는 방식으로 진행을 했는데,,
다시보니까

ex : [2,4,1,2,7,8]
(2,7,8)  , (1,2,4) 

이렇게 해야하더라 ! 내 방식대로하면 sort후 중간값만 가져가기때문에 6이 나올것이다 (2,4)만 챙겨서
그러니까 제일작은값(left)는 그대로 한칸씩 올라가되, right는 -=2씩 해줘야하는구나를 알게돼서 그 부분을 수정했다.

최종제출

class Solution {
    func maxCoins(_ piles: [Int]) -> Int {
        var sum = piles.reduce(0) { $0 + $1
        }
        let piles = piles.sorted(by: <)
        let N = piles.count / 3
        var left = 0
        var right = piles.count - 1

        while left < N {
            sum = sum - (piles[left] + piles[right])
            left += 1
            right -= 2
        }
        return sum
    }
}

다행히 제일빠른 코드가 됐는데, 좀 둘러보니 더 효율적이여보이는 코드가 있어서 그 부분을 한번 둘러봤다.

타인의 코드

class Solution {
    func maxCoins(_ piles: [Int]) -> Int {
        let sorted = piles.sorted { $0 > $1 }

        var result = 0
        var i = 1
        while i < piles.count * 2 / 3 {
            result += sorted[i]
            i += 2
        }
        return result
    }
}

사실 나처럼 이렇게 미리 reduce로 모든 합을 만들어주고 하는게 상황에 따라서는 더 비효율적일 수 있어서, 이분처럼 아예 제일작은것은 배제해서 처음부분은 날려주고, +=2 씩 점프뛰면서 result에 그대로 추가하는 방식도 있었음을 확인했다.

profile
기억보단 기록을

0개의 댓글