[Baekjoon] #5692 팩토리얼 진법

문제

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

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

입력

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

출력

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

예제 입력 1 복사
719
1
15
110
102
0
예제 출력 1 복사
53
1
7
8
8


풀이

import sys

def f(n): # 팩토리얼 구현 함수
    if n > 0:
        return n*f(n-1)
    else:
        return 1
    # return n*f(n-1) if n > 0 else 1: 위와 동일한 결과

while True:
    n = sys.stdin.readline().rstrip('\n') # 오른쪽 \n 제거
    if n == '0':
        break
    res = 0
    for i in range(len(n)):
        res += int(n[len(n)-i-1]) * f(i+1) # 각 자릿수에 해당 팩토리얼값을 곱해서 더해준다.
    print(res)
  • 시간초과를 방지하기 위해 여러줄을 입력 받는 경우 input 대신 sys.stdin.readline()을 활용한다.
    • 이전의 시도들에서 계속 시간초과가 나서 애를 먹었는데, 검색 결과 이게 주된 원인으로 보였다.
  • 팩토리얼은 재귀함수로 구현한다.
  • 각 자리의 숫자들에 팩토리얼을 계산한 값을 곱해 최종 결과에 더하면 간단하게 계산된다.

Leave a comment