출처: https://school.programmers.co.kr/learn/courses/30/lessons/68935
문제 설명
자연수 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 해야 합니다.
내가 30분간 작성한 코드문
import java.util.*;
class Solution {
public int solution(int n) {
int answer = 0;
// n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return
// 12 + 5
// 27 * 1 + 9 * 2 + 0 + 0
// 앞뒤 반전하면 21 -> 2 * 3 + 1 * 1 = 7
String base3 = convertDecimalToBase(n, 3);
//10진법 수를 3진법으로 변환
int base4ToDecimal = Integer.parseInt(base3, 3);
// 앞뒤 반전
String a = Integer.toString(base4ToDecimal);// 문자열 변환후
StringBuffer sb = new StringBuffer(a); // 순서 변경
String reverse = sb.reverse().toString();
// 10진법으로 다시 변환
int ten = Integer.valueOf(reverse).intValue(); // 다시 정수로 바꾼다.
// 그 다음에 10진법 표현
private static String convertDecimalToBase(int decimal, int base) {
StringBuilder sb = new StringBuilder();
// 10진수 정수가 0이 될 때까지 반복
while (decimal > 0) {
// 10진수 정수를 base로 나눈 나머지(n진법으로 변환된 수)
int temp = decimal % base;
if (temp >= 10) { // 나머지 값이 10 이상이면, 'a'부터 시작하는 문자로 변환
sb.append((char) (temp - 10 + 'a'));
} else { // 나머지 값이 10 미만이면 그대로 사용
sb.append(temp);
}
// 다음 숫자를 구하기 위한 나눗셈
decimal = decimal / base;
}
// 문자열 뒤집기
return sb.reverse().toString();
}
private static int convertBaseToDecimal(String num, int base) {
int decimal = 0;
int power = 1; // 거듭제곱을 위한 변수
// 문자열을 역순으로 순회
for (int i = num.length() - 1; i >= 0; i--) {
int digit; // 현재 자릿수의 숫자
char curr = num.charAt(i); // 현재 자리의 문자
if (curr >= '0' && curr <= '9') { // 현재 문자가 숫자라면 해당 숫자로 변환
digit = curr - '0';
} else { // 알파벳 문자(A ~ F)이면 10 ~ 15의 값으로 변환
digit = curr + 10 - 'A';
}
// 현재 자릿수의 숫자 거듭제곱수를 곱하여 10진수에 더함
decimal += digit * power;
// 거듭제곱수를 업데이트
power *= base;
}
return decimal;
}
return answer;
}
}
일단 너무 복잡하고
알고보니 정답은 더 충격적이다.
class Solution {
public int solution(int n) {
String str = "";
while (n != 0) {
str += n % 3;
n /= 3;
}
return Integer.parseInt(str, 3);
}
}
이런 알고리즘도 알아두면 좋을거 같다.
그외에 풀이
class Solution {
public int solution(int n) {
String a = "";
while(n > 0){
a = (n % 3) + a;
n /= 3;
}
a = new StringBuilder(a).reverse().toString();
return Integer.parseInt(a,3);
}
}
class Solution {
public int solution(int n) {
// 1. 3진법으로 변환하고 뒤집기
String reversedBase3 = new StringBuilder(Integer.toString(n, 3)).reverse().toString();
// 2. 뒤집은 3진법 수를 다시 10진법으로 변환
int answer = Integer.parseInt(reversedBase3, 3);
return answer;
}
}