3진법 뒤집기
문제 링크 : 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 해야 합니다.
접근 방식
- 2진법을 구하는 방법과 똑같다.
- 앞뒤 반전은 처음 구하면 바로 String에 집어 넣으면 반전이 된다.
- 먼저 3진법을 반전 된 상태로 구해서 String에 넣는다.
- String에 넣어진 것을 다시 int로 변환한다.
- 변환된 int를 각 자리 수 별로 비교하면서, 현재 값에 맞게 3의 제곱근과 3으로 나눈 나머지를 곱해서 answer에 넣는다.
- answer 리턴
잘못된 접근
테스트 케이스를 통과하고, 제출했는데 런타임 오류가 발생했다. String을 int 타입으로 변환하는 과정에서 10자리를 벗어나서 발생된 오류로 생각되어 자료형을 long으로 변경하니 해결 됐다.
꺼진 불도 다시 보자!! 자료형 항상 생각!!
결과
소스 코드
class Solution {
public int solution(int n) {
int answer = 0;
StringBuilder sb = new StringBuilder();
while(n!=0){
sb.append(n%3);
n/=3;
}
long tmp = Long.parseLong(sb.toString());
int cnt = 0;
while(tmp != 0){
answer += (tmp % 10) * (Math.pow(3, cnt));
tmp/=10;
cnt++;
}
return answer;
}
}
결과 이미지
다른 접근 방식
다른 사람들의 풀이를 보니 비슷했는데, 내가 알지 못하는 메소드의 활용법이 있었다.
바로 pareseInt() 인데, parseInt(a, 숫자) 처럼 사용하면, a 문자열을 숫자 진법으로 변환을 해준다.
숫자를 입력하지 않으면, default가 10진법 변환인 것이고 이 문제에서는 내가 사용했던 코드에 응용하자면 아래와 같이 코드를 간단하게 변환할 수 있다.
class Solution {
public int solution(int n) {
int answer = 0;
StringBuilder sb = new StringBuilder();
while(n!=0){
sb.append(n%3);
n/=3;
}
return Integer.parseInt(sb.toString(), 3);
}
}
알게 된 점
parseInt()
메소드에 두 번째 자리는 진수를 지정
하는 자리,
기본적으로 default 10으로서 10진수로 변환이 되고 필요에 따라 3과 같은 숫자를 대입하면 3진수로 변환 됨!