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;
}
}