[오늘의 문제] 3진법 뒤집기

shlim55·2025년 5월 17일

코딩테스트

목록 보기
54/223

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

문제 설명
자연수 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 해야 합니다.

내가 30분간 작성한 코드문

import java.util.*;
class Solution {
    public int solution(int n) {
        int answer = 0;
        // n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return
        // 12 + 5
        // 27 * 1 + 9 * 2 + 0 + 0
        // 앞뒤 반전하면 21 -> 2 * 3 + 1 * 1 = 7
        
        String base3 = convertDecimalToBase(n, 3);
        //10진법 수를 3진법으로 변환
        int base4ToDecimal = Integer.parseInt(base3, 3);
        
        // 앞뒤 반전
        String a = Integer.toString(base4ToDecimal);// 문자열 변환후  
        
        StringBuffer sb = new StringBuffer(a); // 순서 변경
        String reverse = sb.reverse().toString();
        
        // 10진법으로 다시 변환
        int ten = Integer.valueOf(reverse).intValue(); // 다시 정수로 바꾼다. 
        // 그 다음에 10진법 표현 
        
        private static String convertDecimalToBase(int decimal, int base) {
            StringBuilder sb = new StringBuilder();
            // 10진수 정수가 0이 될 때까지 반복
            while (decimal > 0) {
                // 10진수 정수를 base로 나눈 나머지(n진법으로 변환된 수)
                int temp = decimal % base;

                if (temp >= 10) { // 나머지 값이 10 이상이면, 'a'부터 시작하는 문자로 변환
                    sb.append((char) (temp - 10 + 'a'));
                } else { // 나머지 값이 10 미만이면 그대로 사용
                    sb.append(temp);
                }

                // 다음 숫자를 구하기 위한 나눗셈
                decimal = decimal / base;
            }

            // 문자열 뒤집기
            return sb.reverse().toString();
        }
        
        
        
        private static int convertBaseToDecimal(String num, int base) {
            int decimal = 0;
            int power = 1; // 거듭제곱을 위한 변수

            // 문자열을 역순으로 순회
            for (int i = num.length() - 1; i >= 0; i--) {
                int digit; // 현재 자릿수의 숫자
                char curr = num.charAt(i); // 현재 자리의 문자

                if (curr >= '0' && curr <= '9') { // 현재 문자가 숫자라면 해당 숫자로 변환
                    digit = curr - '0';
                } else { // 알파벳 문자(A ~ F)이면 10 ~ 15의 값으로 변환
                    digit = curr + 10 - 'A';
                }

                // 현재 자릿수의 숫자 거듭제곱수를 곱하여 10진수에 더함
                decimal += digit * power;
                // 거듭제곱수를 업데이트
                power *= base;
            }

            return decimal;
        }

        return answer;
    }
}

일단 너무 복잡하고

알고보니 정답은 더 충격적이다.

class Solution {
    public int solution(int n) {
        String str = "";

        while (n != 0) {
            str += n % 3;
            n /= 3;
        }
        
        return Integer.parseInt(str, 3);
    }
}

이런 알고리즘도 알아두면 좋을거 같다.

그외에 풀이

class Solution {
    public int solution(int n) {
        String a = "";

        while(n > 0){
            a = (n % 3) + a;
            n /= 3;
        }
        a = new StringBuilder(a).reverse().toString();


        return Integer.parseInt(a,3);
    }
}
class Solution {
    public int solution(int n) {
        // 1. 3진법으로 변환하고 뒤집기
        String reversedBase3 = new StringBuilder(Integer.toString(n, 3)).reverse().toString();
        
        // 2. 뒤집은 3진법 수를 다시 10진법으로 변환
        int answer = Integer.parseInt(reversedBase3, 3);
        
        return answer;
    }
}
profile
A Normal Programmer

0개의 댓글