자연수 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진법
으로 변환하는 방식은 2진법
과 같이 3
으로 나눈 나머지를 구하는 것이다. 따라서 여기서는 3
으로 나눈 나머지를 문자열로 변환하여 몫이 0
이 될 때까지 문자열을 연결하였다. 이렇게 문자열을 연결하면 따로 앞뒤 반전을 하지 않아도 자연스레 반전이 되게 된다.
이렇게 해도 되고 다른 사람의 풀이를 보니 Integer.parseInt(10진수,3)
방식으로 하면 10진수
가 3진법
으로 바뀌게 되었다. 알고리즘을 테스트하기 위해서는 사용하는 것을 지양해야 하지만 이런 방식도 있다고만 알아두자.
이제 앞뒤반전인 3진수
를 10진수
로 바꿔야 한다. 이 부분에서 조금 애를 먹었는데 처음에는 3
을 제곱하는 square
메서드를 만들어 매개변수의 승
만큼 3
을 제곱해주었다.
후에는 Math.pow()
메서드를 알게 되어 Math.pow(3, idx++)
형태로 사용하였다. 3
의 idx
승을 구할 수 있고, idx
는 i
와 별개의 변수로 두어 num
에 10진수
가 저장된 후 증가되도록 하였다.
// Math.pow를 사용하지 않은 버전
public class Solution {
public int solution(int n) {
int answer = 0;
String str = "";
int num = n;
while(num != 0) {
str += Integer.toString(num%3);
num /= 3;
}
String[] arr = str.split("");// 배열로 값 하나씩 담기
int idx = 0;
for (int i = arr.length-1; i >= 0; i--) {
num = Integer.parseInt(arr[i]);// 정수로 변환
answer += (num*square(idx++));
}
return answer;
}
public int square(int idx) {
int num = 1;
for (int i = 1; i <= idx; i++) {
num *= 3;
}
return num;
}
}
class Solution {
public int solution(int n) {
int answer = 0;
String str = "";
int num = n;
while(num != 0) {
str += Integer.toString(num%3);
num /= 3;
}
String[] arr = str.split("");// 배열로 값 하나씩 담기
int idx = 0;
for (int i = arr.length-1; i >= 0; i--) {
num = Integer.parseInt(arr[i]);// 정수로 변환
answer += (int)(num*Math.pow(3, idx++));
}
return answer;
}
}