순간을 기록으로

[자바] 3진법 뒤집기 본문

Problem Solving

[자바] 3진법 뒤집기

luminous13 2021. 11. 11. 21:51

문제

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

 

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

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

programmers.co.kr

 

 

느낀점

오랜만에 진법 문제를 푸니깐 낯선 느낌이었다. while문을 이용해서 10진법에서 특정 진법으로 바꾸는 방법을 배웠다. 그리고 특정진법에서 바로 10진법으로 값을 바꾸는 Integer.parseInt(String s, int radix)을 새로 알게 되었다.

 

풀이

// 1.10진법을 3진법으로 바꾼다
// 2.3진법 문자열을 뒤집는다
// 3.뒤집어진  3진법을 10진법으로 바꾼다.
class Solution {
    public int solution(int n) {
        String str = "";
        // 1.10진법을 3진법으로 바꾼다
        while(n>0){     // 몫이 0이 나올 때까지 반복한다
            str = (n%3) + str;  // 나머지를 문자열 앞에 붙인다.
            n = n/3;    // 새로 구한 몫을 새로운 값으로 한다
        }
        
        // 2. 3진법 문자열을 뒤집는다(StringBuilder클래스 reverse()메소드 이용)
        StringBuilder sb = new StringBuilder(str);
        str = sb.reverse().toString();
        
        int decimal = 0;
        for(int i=0 ; i<str.length(); i++) {
            
            int digit = str.charAt(i) - '0';    // 숫자문자 - '0' = 진짜 숫자
            
            decimal += (digit) * Math.pow(3, str.length()-(i+1));
        }
        
        return decimal;
    }
}

 

십진법 45를 3진법으로 바꾸려면 45를 몫이 0이 될 때까지 3으로 나누고 나온 나머지를 반대로 적어주면 된다. 

45 / 3하면   몫:15 나머지 0   

15 / 3하면   몫:5   나머지 0

5 / 3하면    몫:1   나머지 2

1 / 3하면    몫:0   나머지 1

 

이렇게 나오면 몫이 0일 때 반복을 멈추고 나머지를 거꾸로 붙여주면 해당 진법의 값으로 바뀐다.

3진법을 이렇게 구하고 구한 진법을 뒤집을 때에는 StringBuilder 클래스의 reverse() 메소드를 사용한다.

해당 메소드를 사용하기 위해 String 자료형을 StringBuilder 자료형으로 바꿔야 되는데. StringBuilder 객체를 생성할 때 실인자로 String 형을 넣으면 만들 수 있다.

 

마지막으로 특정 진법에서 10진법으로 바꾸는 방법은 위의 코드 방법처럼 하는게 있고 다른 풀이를 보니 더 간단힌 방법이 있었다. Integer.parseInt(Stirng s, int radx)를 사용하면 특정 진법에서 10진법으로 바꿀 수 있다.

Comments