백준 알고리즘
백준 - 6463번 팩트 python 문제풀이 [Hellfer]
Hellfer
2024. 5. 16. 23:26
728x90
https://www.acmicpc.net/problem/6463
문제
N!은 "N 팩토리얼"로 읽으며, 처음 N개의 양의 정수를 곱한 값이다. 이때, N은 음이 아닌 정수이어야 한다.
예를 들면 다음과 같다.
N N!
0 1
1 1
2 2
3 6
4 24
5 120
10 3628800
N을 입력 받아 0이 아닌 마지막 자리를 구하는 프로그램을 작성하시오.
예를 들어, 5!의 경우에 정답은 2이다. 5! = 120이고, 2는 0이 아닌 마지막 자리이기 때문이다.
🔷 알고리즘 분류 - 다이내믹 프로그래밍
난이도 - 실버 5
🔶문제 풀이 - 재귀함수를 이용한 풀이
def factorial(x):
# y를 1로 초기화
y = 1
# 1부터 x까지 반복
for i in range(1, x + 1):
# y에 현재 숫자 i를 곱함
y *= i
# y가 10으로 나누어 떨어지는 동안 10으로 나눠 0을 제거
while y % 10 == 0:
y //= 10
# y의 크기를 너무 크게 하지 않기 위해 100000으로 나눈 나머지만 유지
y %= 100000
# 최종 y의 0이 아닌 마지막 자리를 반환
return y % 10
# 무한 루프를 돌며 사용자 입력을 받음
while True:
try:
# 사용자로부터 정수를 입력받음
n = int(input())
# 입력받은 정수 n에 대해 0이 아닌 마지막 자리를 구함
result = factorial(n)
# 형식에 맞게 출력 (n을 오른쪽 정렬하여 5칸 확보하고 " -> ", 결과값 출력)
print(f'{n:5} -> {result}')
except EOFError:
# EOFError가 발생하면 (입력의 끝), 루프를 종료
break
🔶문제 이해하기
1. 재귀 함수 while 문 안쪽에 y 값을 10이 아닌 10000으로 나눠줘야 정답이 되는 이유
- 계산 중간에 발생하는 매우 큰 수를 관리하기 위해 계산 결과를 일정 크기로 자르는 방법 사용
2. 파일 입력은 try와 except 문을 사용해 파일의 끝인 EOFError가 발생하여 루프를 종료
728x90