반응형
이번 문제는 주어진 값의 각 자릿 수를 서로 곱한 후, 그 결과값의 자릿수가 2 이상이면 해당 계산을 반복하고, 그 횟수에 대해서 return을 해주는 문제입니다.
1. Swift
1-1. 본인의 풀이
func persistence(for num: Int) -> Int {
var returnValue : Int = 0
calculator(&returnValue, value: String(num))
return returnValue
}
private func calculator(_ count: inout Int, value: String) {
guard value.count > 1 else {
return
}
count += 1
let str = String(value.compactMap { element in
return element.wholeNumberValue
}.reduce(1, *))
guard str.count > 1 else {
return
}
calculator(&count, value: str)
}
persistence(for num: Int) -> Int를 재귀로 하는 방법도 있지만, 저는 calculator라는 재귀용 함수를 새로 만들어서 구현을 했습니다.
들어온 값의 길이를 체크하고 1보다 큰 경우가 아니면 종료. 그 외는 String의 각 element를 int로 변경하여 array를 만들고, 그 array의 각 값들을 곱하여 새로 만든 String의 길이를 체크하여 다시 1보다 크다면 calculator를 다시 호출, 아니면 종료하도록 하였습니다.
위 함수 중 guard str.count > 1 else { return } 부분은 없어도 동일하게 동작합니다.
추가로 테스트 케이스를 더 입력하여 확인하였습니다.
import XCTest
// XCTest Spec Example:
// TODO: replace with your own tests (TDD), these are just how-to examples to get you started
class SolutionTest: XCTestCase {
static var allTests = [
("Test Persistence", testPersistence),
("Test Persistence", testPersistenceAgain)
]
func testPersistence() {
XCTAssertEqual(persistence(for: 18), 1)
}
func testPersistenceAgain() {
XCTAssertEqual(persistence(for: 28), 2)
XCTAssertEqual(persistence(for: 39), 3) // 추가
XCTAssertEqual(persistence(for: 999), 4) // 추가
XCTAssertEqual(persistence(for: 4), 0) // 추가
}
}
XCTMain([
testCase(SolutionTest.allTests)
])
1-2. Best Practice
Killectro 라는 유저의 답이 Best Practice에 올랐습니다.
func persistence(for num: Int) -> Int {
let digits: [Int] = String(num).characters.flatMap { Int(String($0)) }
return digits.count == 1 ? 0 : 1 + persistence(for: digits.reduce(1, *))
}
persistence함수를 재귀로 이용하여 답을 구했네요.
입력받은 값이 중요한 것이 아니라 2자리 이상인지 확인을 하여 횟수를 카운트하여 반환하기 때문에 가능한 방법이었습니다.
반응형
'Codewars(알고리즘) > 6Kyu' 카테고리의 다른 글
[Codewars] [6Kyu] Projectile Motion (0) | 2023.06.15 |
---|---|
[Codewars] [6Kyu] Parabolic Arc Length (0) | 2022.01.27 |
[Codewars] [6Kyu] Give me a Diamond (0) | 2022.01.26 |
[Codewars] [6Kyu] Moduli number system (0) | 2022.01.26 |
[Codewars] [6Kyu] Consecutive Strings (0) | 2021.03.05 |