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의 배수로 나누는 방법을 사용하는 것이 좋다.