[Baekjoon][Python]팩토리얼 진법

SOOJIN·2021년 4월 17일
0

algorithm

목록 보기
10/25

문제

상근이는 보통 사람들이 사는 것과는 조금 다른 삶을 사는 사람이다. 상근이는 이런 사람들의 시선이 부담스럽기 때문에, 자신만의 숫자를 개발하기로 했다. 바로 그 이름은 팩토리얼 진법이다. 팩토리얼 진법은 각 자리에 올 수 있는 숫자는 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 math
flag =True
while(flag):
    n = int(input())
    if(n==0):
        flag=False
    else:
        length=len(str(n))
        sum=0
        for i in range(1,length+1):
            sum+=int(n%10)*(math.factorial(i))
            n/=10
        print(sum)

결과: 시간초과 🥲

import math
import sys
while(True):
    n = sys.stdin.readline().strip()
    if(n=='0'):
        break
    else:
        length=len(n)
        sum=0
        for i in range(1,length+1):
            n=int(n)
            sum+=int(n%10)*(math.factorial(i))
            n/=10
        print(sum)

다른 사람 코드

import sys
l=[1,2,6,24,120]
s=input()[::-1]
while s!='0':
    print(sum([l[i]*int(s[i]) for i in range(len(s))]))
    s=sys.stdin.readline().strip()[::-1]

분석

n = int(input()) 은 시간초과가 나서
n = sys.stdin.readline().strip() 으로 썼더니 해결되었다

입력이 5자리로 한정 되어있으니 factorial함수 대신
[1,2,6,24,120] 배열을 만들고 쓰는게 편한 것 같다

s=input()[::-1] 이 뭔지 몰라서 한참 헤멨는데
input을 뒤에서 읽은 문자열이었다
ex)"12345" -> "54321"

백준 '팩토리얼 진법' : https://www.acmicpc.net/problem/5692

0개의 댓글