날쌘 개발자

3진법 뒤집기 본문

코딩테스트/프로그래머스

3진법 뒤집기

훈식이 2022. 5. 14. 22:38
728x90
  • 3진법 뒤집기
문제 설명

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

입출력 예시)

입력 리턴 기대값
45 7
125 229

입출력 예 #1

  • 답을 도출하는 과정은 다음과 같습니다.
n (10진법) n (3진법) 앞뒤 반전 (3진법) 10진법으로 표현
45 1200 0021 7
  • 따라서 7을 return 해야 합니다.

import Foundation

func solution(_ n:Int) -> Int {

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

    for i in result.reversed() {
        resultNum += count * i
        count *= 3
    }

    return resultNum
}

머리가 굳은건지 진수변환 과정이 바로 떠오르지않아 조금 당황스러웠지만
공식을 그대로 구현하니 잘 되었다.
정수를 3으로 나눈 나머지를 끝까지 더해줘 입력받은 10진수 값을 3진수로 변환한뒤,
배열을 뒤집어 인수와 진수를 곱해주었다.


import Foundation

func solution(_ n:Int) -> Int {

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

    for i in 0..<result.count {
        resultNum += result[i] * Int(pow(3.0, Float(i)))
    }

    return resultNum
}

처음에 썼던 코드인데,
입력값이 커지고 출력값이 1억을 넘어가자 정답 기대값과 출력값이 1이나 2가 차이가 났다.

이유는 아마 정확하진 않지만 저것밖에 오류생길곳이 없어보이니.. 살펴 보자면
거듭제곱한 값을 Int값과 곱해주기위해 pow메서드 값을 Int로 형변환해주어야 했는데,
pow메서드가 Int의 init으로 들어가려면 Decimal타입을 받을 수 없어 리턴타입이 애매해진다. 해서 어쩔수없이 pow메서드의 두 파라미터 타입을 확실하게 해주기 위해 Float값으로 변환해서 넣어줬는데,
이 과정에서 값이 커지니 부동소수 타입인 Float값이 변환과정에서 문제를 일으킨것같다.

728x90

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

시저 암호  (0) 2022.06.13
문자열 내림차순으로 배치하기  (0) 2022.05.27
체육복  (0) 2022.04.19
Level 2 - 문자열 압축  (0) 2022.04.15
부족한 금액 계산하기  (0) 2022.04.07