WEEKLYCONTEST 150 문제를 다루고 있습니다.
3452. Sum of Good Numbers
class Solution {
func sumOfGoodNumbers(_ nums: [Int], _ k: Int) -> Int {
var nums = nums
var supArray = (k * 2) - (nums.count - 1) < 0 ? 0 : (k * 2) - (nums.count - 1)
for i in 0 ..< supArray {
nums.append(0)
}
let MAX = nums.count - 1
var sum = 0
let cursor_end = MAX - k
// 상황마다 다르게 보기가 어려움
// 전체 길이를 K의 두배가 될 수 있게 해줘야하나 ?
//
for i in k ... cursor_end {
let left = i - k
let right = i + k
if nums[left] > nums[i] {
sum += nums[left]
}
if nums[right] > nums[i] {
sum += nums[right]
}
}
return sum
}
}
// Solution().sumOfGoodNumbers([1, 3, 2, 1, 5, 4], 2)
print(Solution().sumOfGoodNumbers([2, 1], 1))
print(Solution().sumOfGoodNumbers([47,47], 1))
이렇게 풀어주니 ([17,20], 1)
같은 경우에 좀 에러가 많이 발생을 한다.
이게 길이가 적을 때에 대해서 일부러 i-k
, i+k
잘 탐색할 수 있게 해줬는데, 이럴때에 대해서
[17,20,0]
에서 20을 기준으로 17,0을 비교했을때 다 20보다 작으니 0이 나오게 되는 것인데, 여기서 답은 20이랜다. 그니까 nums[0+k]로 20이 17보다 크다 이얘긴데, 그렇게 기준이 계속 바뀌는 식으로 되면은 구분하기 어렵겠다 싶어서 예외처리를 해주다가 계속 SUBMIT에서 고전을 겪자 노선을 바꾸기로 결정했다.
최종제출
- 결국에는 그냥
left>=0 , right<MAX
로 조건을 걸어주면은 벗어나지않는 상태에서 접근을 할 수 있다는 간단한 사실을 잊고 있었다.- 그렇게해서 그냥 0부터 MAX까지 쭉 올라가면은 알아서 에러없이 충족이 되는 것이다.
class Solution {
func sumOfGoodNumbers(_ nums: [Int], _ k: Int) -> Int {
let MAX = nums.count
var sum = 0
for i in 0 ..< MAX {
let left = i - k
let right = i + k
if left >= 0 && nums[left] < nums[i] {
sum += nums[i]
}
if right < MAX && nums[right] < nums[i] {
sum += nums[i]
}
}
return sum
}
}
이렇게 해줬는데, 14가 나왔다
[1,3,2,1,5,4]
에서 이거 왜이러지? 싶어서 문제를 다시보다보니 이게 숫자가 [1,2]를 비교했을때 2가 좋은수로 판된되는 것인데, 사실 2+k는 5여서 해당이 안되는 부분을 어떻게 피해가지? 하다가 continue를 써줬다.
class Solution {
func sumOfGoodNumbers(_ nums: [Int], _ k: Int) -> Int {
let MAX = nums.count
var sum = 0
for i in 0 ..< MAX {
let left = i - k
let right = i + k
if left >= 0 && nums[left] >= nums[i] {
continue
}
if right < MAX && nums[right] >= nums[i] {
continue
}
sum += nums[i]
}
return sum
}
}
드디어 12가 잘 나오게 되었다..
이게 콘테스트에 나온문제인데, 제출이 많이 없어서 안나오나보다..
오늘 알고리즘은 여기까지!
콘테스트였는데도 생각보다 어렵게 풀어낸 것 같다.