[프로그래머스/Lv. 1] 3진법 뒤집기
🔺 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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,,, 틀린 코드를 주었더니 틀린 이유와 정답을 주었다...