
문제는 단계별로 차근차근 코드를 짜기로 했다. 먼저 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