문제 설명
자연수 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
'Algorithm > Programmers(Java)' 카테고리의 다른 글
| [프로그래머스/Lv.1] 시저 암호 (0) | 2022.12.26 |
|---|---|
| [프로그래머스/Lv.1] 예산 (0) | 2022.12.26 |
| [프로그래머스/Lv.1] 이상한 문자 만들기 (0) | 2022.12.24 |
| [프로그래머스/Lv.1] 같은 숫자는 싫어 (0) | 2022.12.24 |
| [프로그래머스/Lv.1] 최대공약수와 최소공배수 (0) | 2022.12.23 |