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

최준호·2021년 7월 19일
0

algorithm

목록 보기
18/39

문제

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

제한사항

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

입출력 예

풀이

public class ThirdFlipOver {
    public static void main(String[] args) {
        int n = 125;
        ThirdFlipOver f = new ThirdFlipOver();
        int solution = f.solution(n);
        System.out.println("solution = " + solution);
    }

    public int solution(int n) {
        int answer = 0;
        StringBuilder convert = new StringBuilder();
        //3진법으로 변경하기
        while (n>0){
            convert.append(n%3);
            n = n/3;
        }
        //10진법으로 변경하기 java 자체 제공
        //answer = Integer.parseInt(convert.toString(), 3);
        answer = converse(convert.toString(), 3);
        return answer;
    }

    public static int converse(String number, int N){
        char[] nums = number.toCharArray(); // char의 배열로 만들어서 하나씩 숫자별로 대응
        int ans = 0; // 시작은 0으로 시작

        for(int i=0; i < nums.length; i++){
            ans = ans * N + (nums[i] - '0');
        }
        //System.out.println(ans);
        return ans;
    }
}

문제에서는 10진법의 수를 3진법으로 변환한 뒤 뒤집어서 다시 10진법으로 계산하라는 문제인데 StringBuilder나 String으로 append나 +=를 사용하면 자동으로 뒤집힌다. 물론 숫자 자체를 String의 charAt으로 하나씩 배열로 받아서 했어도 됐으나 쉬우니가 이렇게 했다. 어차피 배열로 만들어서 뒤집어서 다시 하는거나 똑같은 작업이니!

다음으로는 10진법의 변환이 문제인데 사실 java에서

answer = Integer.parseInt(convert.toString(), 3);

이렇게 parseInt("변환될 문자열", 변환할 진법 수)로 입력해주면 자동으로 10진법으로 계산해준다. 그래도 나중에 10진법 뿐만 아니라 2진법 4진법 6진법 등 다른 방식으로 계산하라고 할수도 있으니 converse 메서드를 생성하여 변환하는 작업을 진행했다.

진법 변환은 수학 문제이니 알고리즘을 저장해두었다가 진법 변환 문제에서 찾아서 사용하자!

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글