Algorithm/Programmers(Java)

[프로그래머스/Lv.1] 3진법 뒤집기

비망노트 2022. 12. 24. 18:45

문제 설명

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

 

 

✅ 3진수..?

 

3진법.. 처음듣는다..

2진수 8진수 16진수는 사용해봤어도 3진수는 처음보기에 https://ko.wikipedia.org/wiki/ 를 참고했다

처음보는거지만 기본적으로 다른 진수들과 다를건 없었다.

2진수는 2를 사용하지않고 8진수는 8을 사용하지 않는것처럼 3진수 또한 3을 사용하지않는다.

 

 

📍 수열의 진행 방법 (18까지)

 

 

기본적으로 이렇게 흘러가며 문제에서는 십진수와 삼진수를 서로 바꾸는 문제이므로 삼진법과 십진법만 보면된다.

기본개념이 없는 수포자인 나... 직접 적어가며 규칙을 찾아야했다.

 

더보기

3진수 10진수

0 0
1 1
2 2

10 3
11 4
12 5

20 6
21 7
22 8

100 9
101 10
102 11

110 12
111 13        1 = 9 // 1 = 3 // 1 = 1
112 14

120 15
121 16        1 = 9 // 2 = 6 // 1 = 1
122 17

200 18

221 25
222 26
1000 27       1 = 27

1200 45

 

 

 

⭕ 풀이

class Solution {
    public int solution(int num) {
        int result = 0;
		
        String reverse = "";
        while(num>0) {
            reverse += num%3;
            num = num/3;
        }
        long reverseNum = Long.parseLong(reverse);
		
        int trit = 1;
        while(reverseNum>0){
			
            long temp = reverseNum%10;
            result += temp * trit;
            trit *= 3;
            reverseNum /= 10;
        }
		
        return result;
    }
}

 

위에서 하나하나 적어가며 나름의 규칙을 발견해본다고 이렇게저렇게 건드려보며 풀이해봤다.

 

📍 입력받은 10진수를 반전3진수 문자열로 만드는과정 

 

입력받은 수 num을 3으로 나눈나머지를 String타입의 reverse변수에 차례대로 담는다.

이후 num을 3으로 나누는 과정을 반복한다.

예제1)

45 % 3 = 0    reverse = "0"   45/3

15 % 3 = 0    reverse = "00"  15/3

5 % 3 = 2      reverse = "002"  5/3

1%3 = 1        reverse = "0021" 1/3 -> 0 while종료

 

이렇게 되면 예제 1의경우 0021이 담기는데 이과정을 거쳐 reverse는 앞뒤반전된 3진법의 문자열이된다.

 

 

📍 반전3진수를 10진수로 만드는과정

 

이제 이렇게 만들어진 reverse를 다시 10진수로 만들어야하는데

reverseNum에 정수형 int를 사용하니 범위초과때문에 long타입을 사용해 형변환 해주었다

"0021" -> (long타입)21 이 되었고

이제 각자릿수의 누적합을 하듯이

reverseNum%10 즉 1의자리의 수를 임시변수 temp에 담아 result에 누적했다.

누적할 때 21의 1의자리값 즉 1은 그대로 1로 더해야하고

10의자리값인 2는 해당자릿수 * 3을 한뒤 더해야한다

100의자리값이 있다면 해당자리의 수에 *9 를 한뒤 더해야한다

1000의 자리값이 있다면 *27

10000자리*81 ,,,,

즉 1의자리값을 제외한 나머지는 3의 배수로 올라가며 누적해야하기떄문에 

trit변수는 1부터시작해 *3씩 증가시킨다.

 

이렇게 반복문이 끝나면 3진수를 10진수의 값으로 바꾸어진다.

 

 

 

❗❗ Integer.parseInt(숫자형문자열,진수);

parseInt(String s, int radix)
Parses the string argument as a signed integer in the radix specified by the second argument.

 

채점 후 다른사람의 풀이를 봤더니 Integer.parseInt(변수,3) 이렇게 풀이하셨길래 이건 뭐지하고 봤더니

숫자형의 문자열을 첫번째 인자값으로 넣고 두번째 인자에 변환할 진수값을입력하면 해당 진수에 맞춰 Integer형으로 반환해준다...

 

즉 나의 풀이중 두번째 while문은

Integer.parseInt(reverse,3) 한줄로 줄여 사용할 수 있었다.

 

 

 

 

 

 

-출처

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

https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html