https://app.codility.com/programmers/lessons/3-time_complexity/tape_equilibrium/
요약
92 → 100
풀이의 접근은 제대로 한 듯하다.
탐색의 범위가 헷갈렸는데, 나의 잘못과 문제의 잘못이 반반이라고 생각한다.
나의 잘못: 분명 배열을 둘로 나누라고 했으나, 포인터 == size - 1인 경우에는 나뉘지 않는다. 따라서 size - 2까지만 탐색하는 것이 맞다.
문제의 잘못: 포인터의 범위를 0 < P < N로 줬다. 둘로 나뉘지 않는 경우를 방지하기 위해 0을 제외했으면, N - 1까지 제외해야 하는 것 아닌가?
과실 비율은 나 : 문제 = 90 : 10
접근
// 배열을 두 부분으로 나누어서, 각각의 합을 구하고, 두 개의 합의 차이가 최소되는 경우를 구하시오.
// 배열을 한 번 탐색하면서, 현재 포인터 위치의 값을, 각각 합을 저장하는 변수에 빼고 더하고 계속 하다 보면 알 수 있겠다. O(n)
// let size = A.count
// var pointer = 1
// var leftSum = A[0]
// var rightSum = A[1:].reduce { $0 + $1 }
// var minValue = leftSum
// for i in 2..<size {
// leftSum += A[i]
// rightSum -= A[i]
// if leftSum < minValue { minValue = leftSum }
// }
// return minValue
// 더 좋은 방법O(1)이 있을까?
나의 풀이
import Foundation
import Glibc
public func solution(_ A : inout [Int]) -> Int {
let size = A.count
if size == 2 { return abs(A[0] - A[1]) }
var leftSum = A[0]
var rightSum = A.reduce(0, { $0 + $1 }) - leftSum
var minSum = abs(leftSum - rightSum)
for i in 1..<size-1 { // 탐색 범위가 헷갈렸다. // 나눠야 하니까
leftSum += A[i]
rightSum -= A[i]
let tmpSum = abs(leftSum - rightSum)
if tmpSum < minSum { minSum = tmpSum }
}
return minSum
}
'Dev > PS' 카테고리의 다른 글
[Swift 알고리즘] PermCheck - Codility (0) | 2024.01.17 |
---|---|
[Swift 알고리즘] FrogRiverOne - Codility (0) | 2024.01.17 |
[Swift 알고리즘] PermMissingElem - Codility (0) | 2024.01.17 |
[Swift 알고리즘] FrogJmp - Codility (0) | 2024.01.17 |
[Swift 알고리즘] OddOccurrencesInArray - Codility (0) | 2024.01.12 |