(18) 3진법 뒤집기

HK_An·2022년 7월 2일
0
post-thumbnail

문제

문제설명

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

제한사항

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

입출력 예

nresult
457
125229

입출력 예 설명

입출력 예 #1

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

입출력 예 #2

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

힌트

  • 10진법->3진법 표현을 위하여 먼저 제시된 숫자가 3진법으로 표현될 시 가장 큰 자리가 몇번째 자리(이하 p)인지 구합니다.
  • p를 구하기위하여 반복문을 통하여 3의 제곱수만큼 나누어 몫이 1미만인 수를 구하고 그것보다 1이 작은 수가 p입니다.
  • p를 이용하여 3진법 숫자를 구합니다.
  • 구한 3진법 수를 뒤집어 다시 10진법으로 구하여 답을 구합니다.

풀이

	public int solution(int n) {
        int biggestPlaceValue = getBiggestPlaceValue(n); // 3진법 표현시 자릿수를 구한다.
        String ternary = getTernary(biggestPlaceValue, n).toString(); // 자릿수를 이용해 3진법수를 구한다.
        return getDecimal(ternary); // 3진법을 10진법으로 구한 수를 리턴
    }

    int getDecimal(String ternary) {
        int idx = 0;
        int decimal = 0;

        for(char c : ternary.toCharArray()) { // 3진법을 뒤집어야 하므로 앞에서부터 가져온다.
            int digit = Integer.parseInt(c + ""); // 3진법 자리의 수를 구함
            decimal += (int)Math.pow(3, idx) * digit; // 10진법 처리를 위해 다시 3의 제곱수를 곱해준다. 
            idx += 1;
        }

        return decimal;
    }

    StringBuilder getTernary(int biggestPow, int n) {
        StringBuilder stb = new StringBuilder();
        for(int i = biggestPow; i >= 0; i--) { // 최대자리수부터 시작하여 감소
            int num = n / (int)Math.pow(3, i); // 해당 자리의 들어갈 수를 구함
            n = n - (int)Math.pow(3, i) * num; // 3진법 표현한만큼 n감소
            stb.append(num);
        }

        return stb;
    }

    int getBiggestPlaceValue(int n) {
        int biggestPlaceValue = 0;

        for(int i = 0; i <= n; i++) { // 3^0=1, 3^1=3, 3^2=9, ...
            if(n < Math.pow(3, i)) {  // 3의 n제곱이 주어진 수보다 클때
                biggestPlaceValue = i - 1; // n-1이 3진법 표현시 최대자릿수임
                break;
            }
        }

        return biggestPlaceValue;
    }
출처

프로그래머스 - lv1 - 3진법 뒤집기

0개의 댓글