백준 - 팩토리얼 진법[5692]

1 분 소요

이번 포스팅에서는 백준 알고리즘의 팩토리얼 진법[5692] 코딩테스트 연습 문제를 풀어봅니다.

문제 설명

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

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

입력

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

출력

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

입출력 예

입력출력
719
1
15
110
102
0
53
1
7
8
8

문제 풀이

입력 받은 숫자를 리스트로 분할하여 앞자리 부터 (리스트 갯수 - i)수를 구해서 팩토리얼 연산을 분할된 값과 곱해서 모두 더해주면 결과가 나옵니다.

팩토리얼 연산을 제귀 함수 또는 반복문으로 구할 수 있지만 파이썬은 팩토리얼 함수도 이미 구현이 되어 있습니다. 팩토리얼 함수를 사용하여 구현하면 아래와 같이 간단히 구현이 가능합니다.

import sys, math

# 입력
while True:
    num = sys.stdin.readline().strip() # input()은 시간초과가 나옴
    if num == '0':
        break
    else:
        n = list(map(int, list(num)))
        nlen = len(n)
        sum = 0
        for i in range(nlen):
            sum += n[i] * math.factorial(nlen-i) # math.factorial() 함수를 이용
        print(sum)

[입력]
719
1
15
110
102
0
[출력]
53
1
7
8
8

팩토리얼 함수를 직접 구현 할 수도 있지만 구현해서 사용시 백준 사이트에서 시간초과의 늪에 빠질 수 있음으로 따로 구현 하진 않았습니다.

결과는 아래와 같이 잘 통과 되는 것을 확인 할 수 있습니다.

1