[백준] 5692 - 팩토리얼 진법 (파이썬)

hyem·2021년 8월 16일
0

Algorithm

목록 보기
12/12
post-thumbnail

문제

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

🙋‍♀️ 풀이과정

비교적 간단한 문제였다. 일단 팩토리얼값을 구하는 함수 factorial(n)를 하나 선언해놓고, 입력되는 숫자(num)의 각 자리수num[i] 와 i의 팩토리얼값 factorial(i)를 각각 곱해서 다 더해 출력하기만 하면 된다.

람다식을 사용하면 코드가 간결해지는데 혹시 속도도 개선될까? 궁금해서 둘다 제출해봤는데 속도에는 그닥 차이가 없었다. (어차피 range 내에서 반복하는건 똑같고 표현법만 축약)

⚡ 처음에 풀었을때 시간초과가 나서 뭔가 로직이 잘못된줄 알고 헤맸는데, 입력을 sys.stdin.readline()이 아니라 input()으로 처리해서 그런거였다..
둘의 차이는 아래 글에서 잘 정리되어 있어 참고하면 될 것 같다.
https://developeryuseon.tistory.com/90

input()은 자바의 Scanner()처럼 캐릭터 단위로 읽어오는 반면, sys.stdin은 자바의 BufferedReader()처럼 한번에 읽어와 버퍼에 보관했다가 사용자가 요구할 때 버퍼에서 가져오기 때문에 더 빠르다.

이 문제에서 테스트 케이스가 몇개라는 말이 없어서 귀찮아서 걍 input()을 사용했는데.. 웬만하면 그냥 sys 모듈을 써야겠당 ^-^

🎈 완성 코드

import sys

def factorial(n):
    if n == 1:
        return 1
    return n * factorial(n-1)

while True:
    num = sys.stdin.readline().strip()
    if int(num) == 0:
        break  
      
    n = len(num)
    result = 0
    for i in range(n):
        result += int(num[i])*factorial(n-i)
    print(result)


# lambda식 사용
import sys

def factorial(n):
    if n == 1:
        return 1
    return n * factorial(n-1)

while True:
    num = sys.stdin.readline().strip()
    if int(num) == 0:
        break    
    n = len(num)
    print(sum(map(lambda x : int(num[x])*factorial(n-x), range(n))))

0개의 댓글