[프로그래머스] 3진법 뒤집기

최지나·2023년 10월 10일
2

코딩테스트

목록 보기
30/154

문제

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

제한사항
n은 1 이상 100,000,000 이하인 자연수입니다.

입출력 예

nresult
457
125229

입출력 예 설명

  • 입출력 예 #1

답을 도출하는 과정은 다음과 같습니다.

n (10진법)n (3진법)앞뒤 반전(3진법)10진법으로 표현
45120000217

따라서 7을 return 해야 합니다.

  • 입출력 예 #2

답을 도출하는 과정은 다음과 같습니다.

n (10진법)n (3진법)앞뒤 반전(3진법)10진법으로 표현
1251112222111229

따라서 229를 return 해야 합니다.

문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/68935

생각

  • 분명 쉽게 10진법을 n진법으로 바꾸는 방법이 있을 것 같다. 💦 하지만 모를 때도 어떻게든 v풀 수 있어야 하기에 한 번 로직을 생각해보자,,,,

  • 먼저 3진법으로 바꾸었을 때의 자릿수를 구해야 반복문을 돌 수 있을 것 같다

  • 10진법 -> 3진법 변환 시에는 Math.pow(3, *) 로 나눈 몫과 나머지를 사용하자

  • 3진법 -> 10진법 변환은 자릿수를 사용한 for문을 사용하면 구할 수 있을 것 같다

class Solution {
    public int solution(int n) {

        int idx = 0; // 3진법 변환 시 자릿수
        while (true){
            if (n / Math.pow(3, idx) >= 1){
                idx ++;
            } else break;
        }
        
        int left = n;
        StringBuilder sb = new StringBuilder(); // 3진법 수
        for (int i = idx -1; i >= 0; i--){
            int quotient = left / (int) Math.pow(3,i);
            sb.append(String.valueOf(quotient));
            left -= quotient * Math.pow(3,i);
        }
        
        int answer = 0; // 10진법 수
        for (String s : sb.reverse().toString().split("")){
            answer += Integer.parseInt(s) * Math.pow(3, idx-1);
            idx--;
        }
        
        return answer;
    }

}

다른 사람의 풀이


class Solution {
    public int solution(int n) {
        int answer = 0;
        String third = Integer.toString(n, 3); // 10진법 -> 3진법
        StringBuffer sb = new StringBuffer(third);
        String reversed = sb.reverse().toString();

        int exp = 0;
        for (int i = reversed.length() - 1; i >= 0; i--) {
            answer += Integer.parseInt(String.valueOf(reversed.charAt(i))) * Math.pow(3, exp);
            exp++;
        }

        return answer;
    }
}
  • 역시 예상한 것처럼 ⭐10진법을 n진법으로 바꾸는 쉬운 방법⭐이 있었다
  • 이제는 외워봐야겠다

10진법 int m을 n진법 String으로 변환
Integer.toString(m, n);


추가

  • Integer.toString(m, n) 을 사용해서 나의 풀이를 다시 수정해보았다
class Solution {
    public int solution(int n) {

        String reverseBase3 = Integer.toString(n, 3);
        StringBuilder sb = new StringBuilder(reverseBase3);
        int idx = reverseBase3.length();
        
        int answer = 0; // 10진법 수
        for (String s : sb.reverse().toString().split("")){
            answer += Integer.parseInt(s) * Math.pow(3, idx-1);
            idx--;
        }
        
        return answer;
    }

}
profile
의견 나누는 것을 좋아합니다 ლ(・ヮ・ლ)

0개의 댓글