백준 BaekJoon 5692번: 팩토리얼 진법

2021-03-29


문제

상근이는 보통 사람들이 사는 것과는 조금 다른 삶을 사는 사람이다. 상근이는 이런 사람들의 시선이 부담스럽기 때문에, 자신만의 숫자를 개발하기로 했다. 바로 그 이름은 팩토리얼 진법이다. 팩토리얼 진법은 각 자리에 올 수 있는 숫자는 0부터 9까지로 10진법과 거의 비슷하다. 하지만, 읽는 법은 조금 다르다. 팩토리얼 진법에서는 i번 자리의 값을 ai×i!로 계산한다. 즉, 팩토리얼 진법에서 719는 10진법에서 53과 같다. 그 이유는 7×3! + 1×2! + 9×1! = 53이기 때문이다.

팩토리얼 진법으로 작성한 숫자가 주어졌을 때, 10진법으로 읽은 값을 구하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 최대 5자리인 팩토리얼 진법 숫자가 주어진다. 입력의 마지막 줄에는 0이 하나 주어진다.

출력

각 테스트 케이스에 대해서, 입력으로 주어진 팩토리얼 진법 숫자를 10진법으로 읽은 값을 출력한다.


소스코드

 

import java.util.Scanner;

public class TemplateA {	
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);

		while(true) {
			int t = scan.nextInt();
			if(t == 0) {break;}
			//t 가 0 이면 프로그램을 종료한다.
			f = 1;	
			int temp = t % 10;
			//맨 뒷자리 값을 추출할 변수
			t = t / 10;
			//뒷자리를 뺀 나머지 자리를 저장
			int sum = temp * f;
			//팩토리얼 1은 무조건 1이기 때문에
			//sum 초기값은 temp * f 로 지정해준다.
			while(true) {
				f++;
				temp = t % 10;
				t = t / 10;
				sum += temp * (fac(f));	
				//자릿수가 하나씩 많아질때마다 팩토리얼 도 하나씩 증가
				//해당 자릿수에 팩토리얼 값을 곱해줌
				if(t == 0) {break;}	
				//t가 0이면 더이상 비교할 필요 없음
			}

			System.out.println(sum);
		}

	}
	static int f;
	static int x = 1;
	static int y = 1;

	static int fac(int z) {
		do {
			x++;
			y *= x;
		}while(x < f);
		//팩토리얼 method
		return y;
	}
}