Codewars(알고리즘)/6Kyu

[Codewars] [6Kyu] Persistent Bugger.

Dannian 2022. 1. 26. 17:06
반응형
 

Codewars: Achieve mastery through coding challenge

Codewars is a coding practice site for all programmers where you can learn various programming languages. Join the community and improve your skills in many languages!

www.codewars.com

이번 문제는 주어진 값의 각 자릿 수를 서로 곱한 후, 그 결과값의 자릿수가 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자리 이상인지 확인을 하여 횟수를 카운트하여 반환하기 때문에 가능한 방법이었습니다.

반응형