백준

[백준] 6463번: 팩트(파이썬)

초코바나나쉐이크 2024. 10. 3. 17:13

https://www.acmicpc.net/problem/6463

 

흔한 dp문제구나! 라고 생각하고 처음엔 그냥 dp에 9999까지의 팩토리얼 값을 저장하고, num을 입력받은 후 num번 째 값의 팩토리얼 값을 출력하는 식으로 코드를 짰다.

그런데 예시에 있는 9999를 출력하려고 하니 값이 너무 커서 오버플로우 에러가 떳다..(int의 범위를 넘어감)

 

곰곰히 생각해보다가 '1의 자리수만 구하면 되는데 굳이 앞자리가 필요한가?'라는 생각이 들었다.

최대 자리수가 4이니 뒤에서 5개만 유지한 채로 계산을 진행하였다.

dp = [1]

for i in range(1, 10000):
    current = i * dp[-1]
    while current % 10 == 0:
        current /= 10
        
    current = str(int(current))
    current = current[-5:]
    #print(current)
    dp.append(int(current))

while True:
    try:
        num = int(input())
        target = dp[num]
        target = str(target)[-1]
        num = str(num)
        if len(num) == 1:
            print(f'    {num} -> {target}')
        elif len(num) == 2:
            print(f'   {num} -> {target}')
        elif len(num) == 3:
            print(f'  {num} -> {target}')
        elif len(num) == 4:
            print(f' {num} -> {target}')
    except:
        break

예외처리를 안해서 런타임 에러~

딱히 어려운 문제는 아니였는데 문제푸는 시간이 너무 오래걸렸다.. (문제가 좀 더럽긴 했다)

문제 푸는 시간을 단축하려면 어떻게 해야할까 고민이다 ㅠ