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

Park Suyong·2021년 11월 7일
0

개인 알고리즘

목록 보기
14/19

문제

  • 문제 설명

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

  • 제한 사항
    • n은 1 이상 100,000,000 이하인 자연수입니다.
  • 입출력 예시
    n result
    45 7
    125 229

문제 풀이

이 문제는 간단한 문제인데도 불구하고 생각보다 오래 걸렸다..
밑에 코드가 내가 풀었던 방식이다. 좋지 못한 풀이라고 생각한다.

class Solution {
    public int solution(int n) {
        String notation = "";
        
        while(true) {
            if(n < 3) {
                notation += n;
                break;
            }
            if((n / 3) > 2) {
                notation += String.valueOf(n % 3);
                n /= 3;
            }
            else {
                notation += n % 3;
                notation += n / 3;
                break;
            }
        }
        
        char[] nums = notation.toCharArray();
        int sum = 0;
        
        for(int i = 0; i < nums.length; i++) {
            if(nums[i] == '0')
                continue;
            int num1 = (int) Math.pow(3, (nums.length - i - 1));
            sum += (num1 * (nums[i] - '0'));
        }
        
        return sum;
    }
}

다시 풀어본 코드는 아래와 같다.

class Solution {
    public int solution(int n) {
        
        String num = "";
        while(n > 0) {
            num += (n % 3);
            n /= 3;
        }
        
        int answer = Integer.parseInt(num, 3);
        
        return answer;
    }
}

우선 10진법의 수를 3진법으로 변화시키는 코드도 간략화 시켰다. 이전 코드는 답도 없었다..
또한, Integer로 형변환 시켜주는 Integer.parseInt에 인자를 하나 더 추가한다. n 이라는 수를 인자로 넘겼을 때의 의미는 n 진법의 수를 10진법으로 변환한다는 의미이다.

그렇다면 Integer.parseInt를 사용하지 않고 풀어보자.

class Solution {
    public int solution(int n) {
        String num = "";
        while(n > 0) {
            num += (n % 3);
            n /= 3;
        }
        
        char[] nums = num.toCharArray();
        int sum = 0;
        for(int i = 0; i < nums.length; i++) 
            sum += (nums[i] - '0') * Math.pow(3, (nums.length - i - 1));
        
        return sum;
    }
}

nums 라는 char 배열에서 '0'을 빼주는 이유는 ASCII 코드값에서 '0'은 48을 의미하고, 이를 빼야 원래 숫자 값으로 인식될 수 있기 때문이다. 물론, 위 코드는 3진법 이기에 가능한 코드이다.
하지만 코드가 작동하는 시간으로 볼 때 전체적으로 2번째 코드가 가장 빨랐다.

profile
Android Developer

0개의 댓글