프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제

제출한 코드
class Solution {
public int solution(int n) {
StringBuilder sb = new StringBuilder();
while (n > 0) {
sb.append(n % 3);
n /= 3;
}
return Integer.parseInt(String.valueOf(sb), 3);
}
}
풀이
n진법으로 변환하는 로직은 아래와 같다.
// 변환하려는숫자 = x, 사용하려는진법 = n 이라고 가정
while (x > 0) {
sb.append(x % n);
x /= n;
}
문제의 입출력 예시와 같이 45를 3진법으로 변환하기 위해 위의 로직대로 진행한다면 아래와 같은 순서로 진행될 것이다.
| 횟수 | x | n | 나머지 계산 | 결과 | 나누기 | 결과 |
| 1 | 45 | 3 | 45 % 3 | 0 | 45 / 3 | 15 |
| 2 | 15 | 3 | 15 % 3 | 0 | 15 / 3 | 5 |
| 3 | 5 | 3 | 5 % 3 | 2 | 5 / 3 | 1 |
| 4 | 1 | 3 | 1 % 3 | 1 | 1 / 3 | 0 |
따라서 해당 결과를 거꾸로 뒤집으면 1200이 되고 이 숫자가 45를 3진법으로 변환한 숫자가 된다.
하지만 문제에서 앞뒤반전을 시키라고 했으므로, StringBuilder를 따로 reverse 하지 않아도 0021 이라는 값이 잘 들어가게 된다.
마지막으로 parseInt() 를 사용해서 3진법으로 변환된 sb 의 값을 10진법으로 다시 변환해주면 올바른 결과가 나오게 된다.
parseInt() 를 통해 진법 변환을 할 수 있는지 몰랐다. 두 번째 인자로 진법에 대한 숫자를 입력받게 되는데,
예를 들어 parseInt("0021", 3) 이라고 가정하면 3진법으로 변환된 0021 이라는 숫자(문자)를 10진법으로 바꿔서 반환해준다.
이 방법을 몰랐을 때는 아래와 같이 코드를 작성해서 제출했었다.
class Solution {
public int solution(int n) {
StringBuilder sb = new StringBuilder();
while (n > 0) {
sb.append(n % 3);
n /= 3;
}
sb.reverse();
int[] arr = new int[sb.toString().length()];
int[] arr2 = sb.toString().chars().toArray();
int result = 0;
for (int i = 0; i < arr.length; i++) {
result += (int) (Math.pow(3, i) * (arr2[i] - '0'));
}
return result;
}
}
딱 봐도 길고 복잡한 코드이다...
sb.reverse() 를 통해 int 배열인 arr2 를 선언해서 각 자리에 맞는 숫자를 넣어두고
Math.pow() 를 사용해서 result 값을 계산하는 방식으로 했었다.
parseInt() 의 진법변환 기능으로 인해 8줄의 코드를 단 1줄만으로도 이 문제를 풀 수 있게 되었다.
'프로그래머스' 카테고리의 다른 글
| [프로그래머스] 12926번 - 시저 암호 [Java] (0) | 2026.05.08 |
|---|---|
| [프로그래머스] 12930번 - 이상한 문자 만들기 [Java] (0) | 2026.05.04 |
| [프로그래머스] 12950번 - 행렬의 덧셈 [Java] (0) | 2026.04.16 |
| [프로그래머스] 12918번 - 문자열 다루기 기본 [Java] (0) | 2026.04.15 |
| [프로그래머스] 82612번 - 부족한 금액 계산하기 [Java] (0) | 2026.04.14 |