ㅅㅇ

(백준) 팩토리얼 진법 본문

SW_STUDY/알고리즘

(백준) 팩토리얼 진법

SO__OS 2022. 6. 28. 01:45

문제

상근이는 보통 사람들이 사는 것과는 조금 다른 삶을 사는 사람이다. 상근이는 이런 사람들의 시선이 부담스럽기 때문에, 자신만의 숫자를 개발하기로 했다. 바로 그 이름은 팩토리얼 진법이다. 팩토리얼 진법은 각 자리에 올 수 있는 숫자는 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

 

문제풀이 

사용함수 및 적용

 

1. fac 함수 만들어주기

 - 재귀 함수 (함수 내부에서 자기 자신을 호출하는 함수) 로 구현하였다.

 - 파이썬 내부 math 라이브러리 사용 math.factorial(n) 함수를 사용해도 됨.

 

2. input() 대신  sys.stdin.readline()

  - 단순히 몇 줄 입력 받는 문제와 다르게, 반복문으로 여러 줄을 연속적으로 입력 받아야 하는 경우

    input() 으로 데이터를 입력 받으면 시간초과로 오답 판정을 받는 일이 발생할 수 있다.

    현 문제 또한 그러하다. sys 라이브러리에 정의 되어 있는 sys.stdin.readline()  사용해야 함.

   

  - rstrip() 으로 맨 뒤 \n 개행문자 제거 해줘야 함.

 

 

소스코드

import sys

def fac(n):
    if n<=1:
        return 1 # 1을 반환하고 재귀호출 끝.
    return n * fac(n-1) # n과 factorial 함수에 n - 1을 넣어서 반환된 값을 곱함

while True:
    result = 0
    n = sys.stdin.readline().rstrip()
    if n=='0':  # 입력의 마지막 줄을 의미하는 0 이라면 break
        break
    for idx, x in enumerate(n[::-1], start=1):
        result += fac(idx) * int(x)
    print(result)

'SW_STUDY > 알고리즘' 카테고리의 다른 글

재귀함수  (0) 2022.07.10
(백준) 진법 변환  (0) 2022.06.28
(프로그래머스) 비밀지도  (0) 2022.06.28
진법 변환/비트 연산  (0) 2022.06.24
(프로그래머스) 기능 개발 _ python  (0) 2022.06.09