자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
- n은 1 이상 100,000,000 이하인 자연수입니다.
n | result |
45 | 7 |
125 | 229 |
이 문제는 간단한 문제인데도 불구하고 생각보다 오래 걸렸다..
밑에 코드가 내가 풀었던 방식이다. 좋지 못한 풀이라고 생각한다.
class Solution {
public int solution(int n) {
String notation = "";
while(true) {
if(n < 3) {
notation += n;
break;
}
if((n / 3) > 2) {
notation += String.valueOf(n % 3);
n /= 3;
}
else {
notation += n % 3;
notation += n / 3;
break;
}
}
char[] nums = notation.toCharArray();
int sum = 0;
for(int i = 0; i < nums.length; i++) {
if(nums[i] == '0')
continue;
int num1 = (int) Math.pow(3, (nums.length - i - 1));
sum += (num1 * (nums[i] - '0'));
}
return sum;
}
}
다시 풀어본 코드는 아래와 같다.
class Solution {
public int solution(int n) {
String num = "";
while(n > 0) {
num += (n % 3);
n /= 3;
}
int answer = Integer.parseInt(num, 3);
return answer;
}
}
우선 10진법의 수를 3진법으로 변화시키는 코드도 간략화 시켰다. 이전 코드는 답도 없었다..
또한, Integer로 형변환 시켜주는 Integer.parseInt
에 인자를 하나 더 추가한다. n 이라는 수를 인자로 넘겼을 때의 의미는 n 진법의 수를 10진법으로 변환한다는 의미이다.
그렇다면 Integer.parseInt
를 사용하지 않고 풀어보자.
class Solution {
public int solution(int n) {
String num = "";
while(n > 0) {
num += (n % 3);
n /= 3;
}
char[] nums = num.toCharArray();
int sum = 0;
for(int i = 0; i < nums.length; i++)
sum += (nums[i] - '0') * Math.pow(3, (nums.length - i - 1));
return sum;
}
}
nums 라는 char 배열에서 '0'을 빼주는 이유는 ASCII 코드값에서 '0'은 48을 의미하고, 이를 빼야 원래 숫자 값으로 인식될 수 있기 때문이다. 물론, 위 코드는 3진법 이기에 가능한 코드이다.
하지만 코드가 작동하는 시간으로 볼 때 전체적으로 2번째 코드가 가장 빨랐다.