[문풀] pow(2.0,2.0) == 2 ** 2

Kiwi·2024년 4월 4일

Algorithm

목록 보기
13/17
post-thumbnail

⚙️ 3진법 뒤집기


문제는 단계별로 차근차근 코드를 짜기로 했다. 먼저 10진법을 3진법으로 만들고 앞뒤반전을 한 후 10진법으로 표현할 것이다. 그런데 10진법 수를 3진법으로 변화는 과정에서 리스트를 사용하니까 앞뒤반전하는 과정 없이 리스트에 앞뒤반전한 순서대로 결과가 들어갔다.

var num = n
    var result: [Int] = []
    while num >= 3 {
        result.append(num % 3)
        num = num / 3
    }
    result.append(num)

위 코드에서 num이 45라면 실행한 후 result 리스트에는 [0, 0, 2, 1]이 들어가 있다. 이제 다시 3진법수를 10진법으로 돌이키는 과정에서 제곱을 활용했다.

제곱수를 표현하기 위해 **를 사용했지만 플레이그라운드에서 에러가 났다. ** 대신 pow() 메서드를 사용하라는 경고창이 떴다. pow 메서드를 살펴보면 decimal과 Int를 인수로 받고 리턴을 Decimal로 해주고 있다.

그래서 다음과 같이 수정했더니 또 에러가 발생했다.

검색해보니 "Initializer 'init(_:)' requires that 'Decimal' conform to 'BinaryInteger'" 에러는 Decimal 타입이 BinaryInteger 프로토콜을 준수하지 않아서 발생하는 것이라고 한다. BinaryInteger 프로토콜은 이 프로토콜은 정수 타입이 이진 연산을 수행할 수 있도록하는 프로토콜이라고 한다. Double과 Decimal도 다른 타입인데, decimal은 더 정밀한 소수점을 표시하기 위한 타입이라고 생각하면 된다.

정리하면, Decimal을 바로 Int로 바꿀수는 없다! Double은 Int()로 소수점을 버리고 변환이 가능하다.

그래서 수정한 결과는 다음과 같다. pow()메서드의 다른 타입을 사용했다.

블로그를 참고했다.

그렇게 제출한 코드는 다음과 같다.

func solution(_ n:Int) -> Int {
    //3진법으로
    var num = n
    var result: [Int] = []
    while num >= 3 {
        result.append(num % 3)
        num = num / 3
    }
    result.append(num)
    num = 0
    for i in 0...result.count-1 {
        num += Int(pow(3.0,Float(i))) * result[result.count-1-i]
    }
    return 0
}

pow(: Float, : Float) -> Float

profile
🐣 iOS Developer

0개의 댓글