Programmers / Level 1 / 3진법 뒤집기
[문제 설명]
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
[제한사항]
- n은 1 이상 100,000,000 이하인 자연수입니다.
[입출력 예]
n result
45 | 7 |
125 | 229 |
우선, 3진법으로 나타내기 위해
String형 변수에 num%3을 더해주었다.
원래 문제대로라면, 3진법으로 한 번 변환을 하고 앞뒤 반전을 시켜야하는데
아래 코드처럼 answer += (num%3) => 이런식으로 한다면 앞뒤 반전을 시킨 대로 나오기 때문에 굳이 한 번 더 반전을 시킬 이유가 없다.
그리고 해당 숫자를 또 10진법으로 변환해야 한다.
3진법 -> 10진법 이므로,
3^0 => 3^1 이런식으로 자릿수에 따라 제곱수를 바꿔가며 해당 자릿수에 곱해서 sum에 더해주는 방식으로 문제를 해결했다.
public static int solution(int n) {
String answer = "";
int num = n;
while(true) {
if(num < 3) {
answer += num;
break;
}
answer += (num%3);
num /= 3;
}
int sum = 0;
int len = answer.length();
int idx = 1;
for (int i = len-1; i >=0; i--) {
String c = answer.charAt(i) + "";
sum += (Integer.parseInt(c) * idx);
idx *= 3;
}
return sum;
}
그런데, 다른 사람 풀이를 보다가 10진수로 간편하게 변환하는 방법이 있다는 걸 알았다.
Integer.parseInt를 이용하는 방법인데,
Integer.parseInt 안에 String 변수를 넣고 radix를 넣어주면 된다
예로, Integer.parseInt(result, 3) 을 하는 경우엔 result를 3진수에서 10진수로 변환해준다!
이에 대해 좀 더 자세히 알아보려고 검색을 하다가 10진수 -> 3진수 변환 또한 간편하게
toString(int n, int radix) => 를 통해 할 수 있다는 걸 알게됐다.
해당 코드는 아래 코드로, 정말 간단하게 3줄만으로 출력할 수 있다.
다른 사람들 풀이에선 보지 못한 코드인 것 같다!
public static int solution(int n) {
String answer = Integer.toString(n, 3); // 10진수 -> 3진수
answer = new StringBuilder(answer).reverse().toString();
return Integer.parseInt(answer, 3); // 3진수 -> 10진수
}