본문 바로가기

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

[Java][프로그래머스-코딩테스트 level1] 3진법 뒤집기

o 요구사항
자연수 -> 3진법 변환 -> 앞뒤 순서 변환 -> 10진법 변환하여 리턴(int)

 


o 코드설계
1. N진법 변환하기
임의의 수 Number를 N진법으로 변환한 수는 Number가 0이 될 때까지 Number를 N으로 나눈 나머지를 각 자릿값으로 나타낸 값과 같다.
이때 나머지는 마지막에 나온 나머지를 첫숫자로 해서 거꾸로 읽어나간다

 


2. N진법 숫자 10진법 계산하기
N진법 숫자 Number는 뒤에서부터 N의 0제곱, N의 1제곱... 이런 식으로 진행된다
Number가 위치하는 자릿값과 자릿수를 곱하고 모두 더하면 10진법으로 변환된다

 


o 완성코드

import java.util.ArrayList;
import java.util.List;

class Solution {
    public int solution(int n) {
        double k = toDecimal( toTernary(new ArrayList<Integer>(), n) );
        return (int)k;
    }
    
    //3진법 변환. 원래는 거꾸로 읽어나가야 하지만
//문제에서 앞뒤 변환하라는 조건이 있으므로 앞에서부터 순서대로 읽어나간다
    List<Integer> toTernary(List<Integer> list, int m){    
     while(m/3 > 0) {    //몫이 변환하려는 진법, 즉 3보다 크다면
     int k = m%3;    
     list.add(k);
     m = m/3; //3으로 나눈 몫을 다시 인자값으로 넣어준다.
     }
     list.add(m%3); //리스트에 값 추가
     return list;
    }
    
    //반전된 값을 10진법으로 계산
    double toDecimal(List<Integer> list){
     double k = 0;
     for(int i=0; i<list.size(); i++) {
     k = k+ list.get(i) * Math.pow(3, list.size() - (i+1));
     }
     return k;
    }
}