hoon's bLog

Java 프로그래머스 3진법 뒤집기 자바 본문

코딩테스트/프로그래머스

Java 프로그래머스 3진법 뒤집기 자바

개발한기발자 2022. 6. 11. 08:13
반응형

문제출처 : https://programmers.co.kr/learn/courses/30/lessons/68935

 

코딩테스트 연습 - 3진법 뒤집기

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

programmers.co.kr


 

[나의 풀이]

- 최초 값 n에 대해 3진법으로 변환하여 String으로 저장하는 로직(while문)

- 앞뒤 반전을 위한 로직(for문)

- 반전한 3진법 String을 한자리씩 잘라 10진법으로 변환(for문)

public class Solution03 {
    public int solution(int n) {
        int answer = 0;
        String org = "";	//원래 입력한 10진법
        String chg = "";
        while(n > 0){           //3진법 만드는 로직
            org = (n%3) + org;  //3 나눈 나머지 스트링으로 더하기
            n /= 3;             //3 나눈채로 저장하고 반복
        }
        for (int i=0; i<org.length(); i++){
            chg = org.substring(i, i+1) + chg;  //위치별로 자른 스트링값을 순차적으로 뒤쪽부터 저장
        }
        for (int j=0; j<chg.length(); j++){
            int tmp =0;
            //스트링 앞자리부터 Integer로 변환
            tmp = Integer.parseInt(chg.substring(j, j+1));
            
            //0*3^3 + 0*3^2 + 2*3^1 + 1*3^0 = 7
            answer += tmp * (int) Math.pow(Double.parseDouble("3"), Double.parseDouble(String.valueOf(chg.length()-j-1)));
        }
        return answer;
    }
}

 

반복문이 덕지덕지한 미친 코드...

과연 다른 분들은 어떻게 하셨을까??

 

[다른사람의 풀이-1]

class Solution {
    public int solution(int n) {
        int answer = 0;
        String num = "";

        while(n > 0) { //애초에 거꾸로 String을 저장함으로써 for문 하나 절약...
            num = n%3 + num;
            n /= 3;
        }

        for(int i = 0; i < num.length(); i++) {
        	//getNumericValue 메서드를 통해 num의 char형 숫자를 int형으로 바꾸어 곱해준다!!!!!
            answer += Math.pow(3, i) * Character.getNumericValue(num.charAt(i));
        }
        return answer;
    }
}

[다른사람의 풀이-2]

class Solution {
    public int solution(int n) {
        String a = "";

        while(n > 0){	//여기까지는 동일
            a = (n % 3) + a;
            n /= 3;
        }
        //StringBuilder.reverse를 사용하여 뒤집기....
        a = new StringBuilder(a).reverse().toString();
        return Integer.parseInt(a,3);
    }
}

 

정리

- n진법으로 만드는 로직은 반드시 기억할 것!
- 문자열을 뒤집는데는 여러 방식들이 존재하나 반복문의 반복을 피할 것!

 

개인피셜 난이도 : ★☆☆☆☆

1레벨이라 그런지 아직 난이도의 큰 어려움은 없다.

하지만 다른 사람들의 풀이는 이게 난이도 1의 생각일까 싶을 정도로 단순하고 간결하다!

(아마 이 분들은 난이도 1로도 생각 안하실듯...)

다른 사람들의 코드 분석을 통한 내 코드 리뷰는 언제나 처참한 것 같다....

이 처참함의 역치를 점점 낮춰 가는 것이... 이 세계에서 살아남는 길인듯하다...

 

끝!

728x90
반응형