1561. Maximum Number of Coins You Can Get
문제 설명
- 배열이 주어진다 3n길이 ( 3엔빵가능한 길이)
- 그걸 3개의 튜플로 만들어서 중간값을 내가 가질건데,
- 그 값의 합이 가장 크도록해서 합을 return
문제 접근
- 결국엔 중간값만 잘 더해주면될 듯
- 이전에 활용했던
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에 그대로 추가하는 방식도 있었음을 확인했다.