코테/프로그래머스

[프로그래머스/Lv. 1] 3진법 뒤집기

imname1am 2023. 3. 7. 13:31
반응형

🔺 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

🔺 코드 1

import java.util.*;

class Solution {
    public int solution(int n) {
        
        Stack<Integer> s = new Stack<>();
        int answer = 0;
        
        while(n > 0) {
            s.push(n % 3); 
            n /= 3;       
        }
        
        String str = "";
        
        while(s.size() > 0) {
            str += Integer.toString(s.pop());
        }
        
        int len = str.length();
        
        for(int i=0 ; i < len ; i++) {
            int num = str.charAt(i) - '0';
            answer += num * Math.pow(3, i);
        }
        
        
        return answer;
    }
}

스택을 이용해야겠단 생각이 들어서 스택을 썼다.

3진수를 10진수로 변환할 때 문자열로 변환해 처리해보고자 했는데, 성능 상 좋지 않다고 했다.

 

🔺 코드 2

import java.util.*;

class Solution {
    public int solution(int n) {
        
        Stack<Integer> s = new Stack<>();
        int answer = 0;
        
        while(n > 0) {
            s.push(n % 3); 
            n /= 3;       
        }
        
        int pow = 1;
        while(s.size() > 0) {
            answer += s.pop() * pow;
            pow *= 3;
        }
        
        return answer;
    }
}

그래서 위 방식보다 성능이 더 낫다는 스택에서 꺼낸 자릿수와 3의 거듭제곱을 곱해가면서 누적합을 계산하는 방식...!을 사용해봤다.

 pow 변수를 1로 설정하고 저렇게 3의 거듭제곱을 곱할 생각을 못 했다..

그냥 Math.pow() 쓸 생각에만 갇혀버려쓰,,,

 

 


🔺 코드 3

진법 변환을 이용해 풀었다. (참고 : https://cornarong.tistory.com/48)

import java.util.*;

class Solution {
    public int solution(int n) {        
        StringBuilder sb = new StringBuilder(Integer.toString(n, 3));	// 10진법 숫자 n을 3진법으로 변경
        String tmp = sb.reverse().toString();	// 앞뒤 반전 (3진법)
        
        return Integer.parseInt(tmp, 3);	// 10진법으로 표현 (3진법 -> 10진법)
    }
}

🔺 다른 풀이들

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

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

        while(n > 0){
            a = a + (n % 3);
            n /= 3;
        }
        a = new StringBuilder(a).toString();


        return Integer.parseInt(a,3);
    }
}

대박대박대박

StringBuilder를 사용하셨고, Integer.parseInt를 사용해서 3진수를 10진수로 쉽게 변환하셨다,,,,

Integer.parseInt(a, 3); : 3진수인 a를 10진수로 변환

 

자바 Integer.parseInt() 진수 표현

문자열을 숫자로 바꾸는 메소드 parseInt 진수변환때 너무 헷갈리더라 String a =1000; int b= Integer.parseInt(a, 3); // 3진수인 a를 10진수로 int c= Integer.parseInt(a, 16); //16진수인 a를 10진수로 int c= Integer.parseInt(

nsmchan.tistory.com


(참고)

+ ChatGPT,,, 틀린 코드를 주었더니 틀린 이유와 정답을 주었다...

반응형