적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Algorithm/Programmers

[Swift 알고리즘] Programmers 3진법 뒤집기

hongssup_ 2022. 2. 9. 09:56
반응형

Level 1 월간 코드 챌린지 시즌 1

3진법 뒤집기

문제 설명
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- n은 1 이상 100,000,000 이하인 자연수입니다.

 

입출력 예시

print(solution(45)) //7
print(solution(125)) //229

 

내 답안

import Foundation

func solution(_ n:Int) -> Int {
    return Int(String(String(n, radix: 3).reversed()), radix: 3)!
}

풀이

 func solution(_ n:Int) -> Int {
    //3진법 변환
    let binary = String(n, radix: 3)
    //거꾸로 뒤집기
    let reversed = String(binary.reversed())
    //10진법 변환
    let decimal = Int(reversed, radix: 3)!
    return decimal
}

 

radix 이용해서 진수 변환하는 법만 알면 간단하게 풀수 있는 문제더라. 

진수 변환 참고 : https://hongssup.tistory.com/295

 

진수 변환 radix 안쓰고 풀면 다음과 같이 pow를 이용해 풀 수도 있다. 

import Foundation

print(solution(45)) //7
print(solution(125)) //229

func solution(_ n:Int) -> Int {
    var decimal = n
    var binary = [Int]()
    while decimal > 0 {
        binary.append(decimal % 3)
        decimal /= 3
    }
    print(binary)
    binary = binary.reversed()
    var result = 0
    for i in 0..<binary.count {
        result += Int(pow(3.0, Float(i))) * binary[i]
    }
    return result
}

* 주의 : pow 결과값을 Int로 반환하고 싶으면 인자를 Float이나 Double 같은 소수점으로 설정해주어야 한다. 

안그러면 다음과 같은 에러가 난다. 

Initializer 'init(_:)' requires that 'Decimal' conform to 'BinaryInteger'

728x90
반응형