will come true

[프로그래머스 / Level1] 3진법 뒤집기 (Java) 본문

Algorithm

[프로그래머스 / Level1] 3진법 뒤집기 (Java)

haehyun 2021. 10. 30. 22:44
728x90

문제

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

 

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

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

programmers.co.kr

 

기존 코드 (성공)

public int solution(int n) {
    int answer = 0;
    StringBuffer sb = new StringBuffer();
    
    while(n > 0){
        sb.append(n % 3);		//45 -> 0021 (실제 3진수 값은 1200, 원래라면 뒤집어야 3진수값)
        n /= 3;
    }
    
    sb.reverse();				//0021 -> 1200
    
    //3진수값 1200을 뒤집은 0021의 10진수 값을 얻어야 하기에, 뒤집지 않은 1200의 앞에서 부터를 3^0, 3^1, ..자리로 취급
    for(int i=0; i<sb.length(); i++){
        answer += ((int)sb.charAt(i) - '0') * (Math.pow(3, i));
    }
    
    return answer;
}

 

학습 내용

10진수 → n진수

몫이 n보다 작아질 때까지 n으로 나누는 걸 반복. 매 나눗셈에서 산출된 나머지 값을 역순으로 이어붙인 것이 n진수 값

10진수 45를 3진수 1200으로 변환하는 과정

n진수 String → 10진수 int

메서드 설명
Integer.parseInt(String s, int radix) radix진수인 s값을 10진수 int값으로 변환
public int parseTrit(int n) {
	String trit = "";
	
	while(n > 0) {
		trit = (n % 3) + trit;		//먼저 나온 나머지 값이 뒤로 가야함
		n /= 3;
	}
	
	return Integer.parseInt(trit, 3);
}

 

개선 코드 (성공)

public int solution2(int n) {
	String trit = "";
	
	//3진법 결과의 거꾸로를 10진수로 변환
	while(n > 0) {
		trit += (n % 3);
		n /= 3;
	}
	
	return Integer.parseInt(trit, 3);
}

- 정상적인 3진법 결과는 앞의 나눗셈에서 나온 나머지값이 뒤로 가야 하기 때문에 trit = (n%3) + trit 지만,
  본 문제는 3진법을 반대로 뒤집은 값을 10진수로 변환하는 것이기 때문에 trit += (n%3)

728x90
Comments