유니 코드

[PGS/프로그래머스][Lv1] 3진법 뒤집기(Kotlin) 본문

알고리즘/미분류

[PGS/프로그래머스][Lv1] 3진법 뒤집기(Kotlin)

꼬물쥰 2022. 5. 9. 21:02

[문제 설명]

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

 

[제안사항]

  • n은 1 이상 100,000,000 이하인 자연수입니다.
  •  

[입출력 예]

n result
45 7
125 229

 

[입출력 예 #1]

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

 

[입출력 예 #2]

  • 답을 도출하는 과정은 다음과 같습니다.
n(10진법) n(3진법) 앞뒤반전(3진법) 10진법
125 11122 22111 229
  • 따라서 229를 return 해야 합니다.

 

[풀이]

1) 3진법 변환 : input 값을 감소시키면서 반복문 진행

2) stack의 요소를 하나씩 pop하면서 10진수로 변환

 

3진법 변환은 수월하게 코드를 짤 수 있었다. 문제는 10진수로 변환하는게 까다로웠다.

문제를 읽고 바로 코드를 짜서 그런듯하다..

 

어떻게 할지 고민하다가 stack을 이용하기로 결정했다.

stack마지막에 추가된 요소가 가장 먼저 나오기 때문에 굳이 배열을 뒤집지 않기 때문에 적합하다고 생각했다.  

 

내가 작성한 코드로 테스트 코드를 통과한 후 다른 사람의 풀이를 보는데

아주 놀라운 코드를 발견했다.....(밑에 첨부)

실화인가.... 코드가 한줄인것도 놀랍지만

더 놀라웠던 것은 toString과 toInt에 인자를 넣어서 사용할 수 있다는 것이었다..

fun String.toInt(radix: Int): Int

 

 

 

[코드]

import java.util.Stack

class Solution {
    fun solution(n: Int): Int {
        var answer: Int = 0
        var input = n
        val stack = Stack<Int>()
        
        while(input >= 3){
            stack.add(input % 3)
            input /= 3
        }
        stack.add(input % 3)
        var base = 1
        
        for(i in 0 until stack.size){
            answer += stack.pop() * base
            stack *= 3
        }        
        return answer
    }
}
Comments