본문 바로가기
문제풀이/프로그래머스

3진법 뒤집기 / 프로그래머스 연습문제 / programmers / level1 / Java

by RUCKUS 2021. 7. 29.

https://programmers.co.kr/learn/courses/30/lessons/68935

 

코딩테스트 연습 - 3진법 뒤집기

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

programmers.co.kr


이번 문제의 핵심은 진수에 대해 이해하는 것이다.

 

10진수를 n진수로 변환하는 과정은 해당 숫자가 0이 되기전까지  n으로 나눈 나머지를 차례대로 적고, n으로 나눈 수를 계속 n으로 나누면서 과정을 반복하면 된다.

 

10진수 45를 3진수로 변환하는 예시

45 / 3 = 15 ... 나머지 0
15 / 3 = 5 ... 나머지 0
5 / 3 = 1 ... 나머지 1
2 / 3 = 0 ... 나머지 2

이걸 뒤에서 부터 적으면 1200 이 된다. 그럼 다시 반대로,

3진수 1200을 10진수로 변환하는 예시

1 * 3³ + 2 * 3² + 0 * 3 + 0
= 27 + 18 + 0 + 0
= 45

끝의 자리를 제외하고 하나하나 씩 n진수의 제곱을 한 다음 해당 숫자를 곱해서 더하면 된다.

 

그럼 코드를 보자.

 

[작성코드]

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        String digit3 = get3digit(n);
        System.out.println(digit3);
        
        answer = get10digit(digit3);
        
        return answer;
    }
    
    public String get3digit(int n) {
        
        String res = "";
        
        while(n > 0) {
            
            res += Integer.toString(n % 3);
            n = n / 3;
        }
        
        return res;
    }
    
    public int get10digit(String digit3) {
        
        int res = 0;
        
        for (int i = 0; i < digit3.length(); i++ ) {
            
            int digit = Character.getNumericValue(digit3.charAt(i));
            
            res += digit * Math.pow(3, digit3.length()-i-1);

        }
       
        return res;
        
    }
    
}

문제에서 요구한 것은 10진법 -> 3진법 -> 3진법 앞뒤반전 -> 10진법인데

사실 스트링으로 앞에서부터 더해주면 이미 앞뒤반전된 상태의 결과가 나온다.

그리고 나는 3 -> 10과 10 -> 3으로 변환하는 메소드를 각각 작성하여 구현하였다.

 

진수변환만 이해하면 크게 어렵지 않다. 끝.

 


[깃허브링크]

https://github.com/RUCKUSJERRY/practiceOfAlgorithm/blob/main/Prs_Pratice/src/com/level01/digit3to10.java

 

GitHub - RUCKUSJERRY/practiceOfAlgorithm

Contribute to RUCKUSJERRY/practiceOfAlgorithm development by creating an account on GitHub.

github.com