(Swift) 백준 1110 더하기 사이클

SteadySlower·2022년 5월 8일
0

Coding Test

목록 보기
15/298

1110번: 더하기 사이클

처음 풀이

// https://www.acmicpc.net/problem/1110

let N = Int(readLine()!)!

extension Int {
    func addDigits() -> Int {
        let digitArray = String(self).map { Int(String($0))! }
        return digitArray.reduce(0, +)
    }
    
    func lastDigit() -> Int {
        let digitArray = String(self).map { Int(String($0))! }
        return digitArray.last!
    }
}

var tries = 0
var newNum = N

while true {
    tries += 1
    if newNum < 10 {
        newNum = newNum * 10 + newNum
    } else {
        newNum = newNum.lastDigit() * 10 + newNum.addDigits().lastDigit()
    }

    if N == newNum {
        print(tries)
        break
    }
}
  • 2자리 수를 다루는 것인데 너무 코드가 복잡하다
  • 일단 수행하고 나중에 조건을 따지는 반복문은 repeat-while문을 쓰는 것이 좋다.
  • N이 10 이하일 때 예외조건인 것 같지만 따져보면 동일한 연산이다

개선된 풀이

import Foundation

func addDigit(num: Int) -> Int {
    let a = num / 10
    let b = num % 10
    let c = (a + b) % 10
    return b * 10 + c
}

let N = Int(readLine()!)!

var cycle = 0
var newN = N

repeat {
    cycle += 1
    newN = addDigit(num: newN)
} while (newN != N)

print(cycle)
  • 각각의 자릿수를 활용할 때는 10의 배수로 나누는 방법을 사용하는 것이 좋다.
profile
백과사전 보다 항해일지(혹은 표류일지)를 지향합니다.

0개의 댓글