한 걸음 두 걸음

baekjoon 6504번 계산 구현문제 ] 문자열, 진법 본문

CSE/baekjoon & swexpert

baekjoon 6504번 계산 구현문제 ] 문자열, 진법

언제나 변함없이 2019. 2. 21. 12:28
반응형
import java.util.*;
public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int testCase = sc.nextInt(); 
        int kmValue[] = new int [testCase];
        int result[] = new int [testCase];

        //피보나치수열값을 미리 만들어둡시다!
        int arrayF[] = new int [22]; //최대값이 25000이므로 22까지만 생성합니다.
        arrayF[0] = 1; arrayF[1] = 2;
        for(int i = 2; i < 22; i++) {
            arrayF[i] = arrayF[i-1] + arrayF[i-2];}

        //km값으로 입력받고 피보진법 변환 후 마일 값으로 바꿔서 출력합니다.
        for(int i = 0 ; i < testCase ; i++ ) {

            kmValue[i] = sc.nextInt();
            String fivoStr = makeFivo(kmValue[i] , arrayF);
            result[i] = toMile(fivoStr, arrayF);
            System.out.println(result[i]);

        }
    }

    //피보진법으로 나타낼께요
    static String makeFivo(int kmValue, int[] arrayF) {
        StringBuilder fivoStr = new StringBuilder("");
        int index = 21;

        while(index > 0) { //어차피 맨 마지막 비트 버릴거라서 계산에서 빼버림
            if(kmValue / arrayF[index] >= 1) { fivoStr.append("1"); kmValue %= arrayF[index];}
            else  fivoStr.append("0");
            index--;
        }

        String returnStr = fivoStr.toString();
        return returnStr;
    }

    //피보진법을 받아와 마일로 계산하는 함수입니다.
    static int toMile(String fivoStr, int[] arrayF) {
        int resultMile = 0;

        for(int j = 0; j < 21; j++) {
            if(fivoStr.charAt(j)=='1')  resultMile += arrayF[20-j];
        }

        return resultMile;
    }

}
반응형