본문 바로가기

알고리즘/Programmers

[Programmers] 3진법 뒤집기

문제 설명

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


제한사항

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

입출력 예

nresult

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 해야 합니다.

풀이코드

더보기
import java.util.*;

// 3진법 : 3증가시마다 한자리수씩 증가
// 나머지는 1 2 로 표현
// 3 = 10, 6 = 20, 9 = 100, 12 = 110, 15 = 120, 18 = 200, 21 = 210
// 2진법 문제를 풀때와 비슷하다고 보면됨
class Solution {
    public int solution(int n) {
        int answer = 0;
        int num = n;
        Stack<Integer> stack = new Stack<>();
        
        // 3으로 나눈 나머지값을 stack에 담는다
        while(num > 0) {
            stack.push(num % 3);
            num /= 3; // num을 줄여나가면서 while 종료
        }
        
        int cnt = 0; // 3의 n승 계산
        while(stack.contains(1) || stack.contains(2)) {
            // answer 에는 stack의 최상단값과 3의 n승을 곱한값을 담음
            answer += (stack.pop() * (Math.pow(3, cnt)));
            cnt++;
        }
        
        return answer;
    }
}




풀이방법

10진법으로 받은 n이라는 정수를 삼진법으로 변환한후 그 삼진법을 뒤집어 다시 10진법으로 바꾸는 문제이다. 뒤집어야 한다는 점에서 Stack을 사용한다면 뒤집기를 하지않아도 된다고 판단하여 stack을 사용하였다.

 

  1. stack에 3을 나눈 나머지값을 담는다.
    ( 10진법의 2진법 변환도 이와같은 방식으로 할 수 있다. 단, 제대로된 3진법이나 2진법을 만들기위해선 마지막에 값을 뒤집어줘야한다. )
  2. num을 줄여줘야 반복문을 빠져나갈수있기때문에, num을 3으로 계속 나눠준다.
  3. 3진법을 다시 10진법을 바꿀때에는 자리수에 맞춰서 3의 n승을 곱 해주면된다. 여기서는 값을 뒤집어 담았기때문에 현재 값의 위치를 알수있는 cnt라는 변수를 선언하고 반복문을 돌때마다 증가시켜줬다.