백준 1629 문제 시간초 1등 기념 포스팅

2024. 8. 31. 17:29알고리즘

let input = readLine()!.split(separator: " ").compactMap { Int($0) }
let a = input[0], b = input[1], c = input[2]


func solution(_ a: Int, _ b: Int, _ c: Int) -> Int {
  if b == 1 {
    return a
  }

  if !b.isMultiple(of: 2) {
    return a * solution(a, b - 1, c)
  }

  let half = solution(a, b / 2, c) % c
  return half * half % c
}

print(solution(a, b, c))

다른 문제와 다르게 연산 시간을 줄여준 비결은 isMultiple(of: )에 있었다.
이런 소소한 즐거움이 계속 문제를 푸는 동력이 되었으면 좋겠다 ㅎㅎ

isMultiple(of: )는 apple opensource에서 확인해 볼 수 있었다. 엣지 케이스를 필터링하는 점에서 차이가 나는 것 같은데..... 음..

@inlinable
  public func isMultiple(of other: Self) -> Bool {
    // Nothing but zero is a multiple of zero.
    if other == 0 { return self == 0 }
    // Special case to avoid overflow on .min / -1 for signed types.
    if Self.isSigned && self == .min && other == -1 { return true }
        // Having handled those special cases, this is safe.
    return self % other == 0
  }

https://github.com/swiftlang/swift/pull/18689/commits/03d8ce571e6ea1bc581b82d4df48435812bfb58f#diff-85c2cb11798c88779fb7a31a95fd986b757134be42ddb0f3aeced64835566b53

'알고리즘' 카테고리의 다른 글

[백준] 7576 토마토 🍅  (0) 2022.04.14