문제 분석
- 자연수 A를 B번 곱한 수를 알고 싶다.
- but 구하려는 수가 매우 커질 수 있으므로 이를 C로 나눈 나머지를 구하는 프로그램을 작성하라
코드 설계
- a,b,c는 20억 미만의 수
- 시간 제한 0.5초
정답 코드
1차 -실패 (런타임 에러)
재귀
import sys
input = sys.stdin.read
def mul(num, times, cnt) :
if times == cnt :
return num
else :
return num * mul(num, times, cnt+1)
a,b,c = map(int, input().split())
print(mul(a,b,1) % c)
디버깅하면 답은 구하는데 시간도 오래걸리고 런타임 에러
** by chatGPT
mul ( a,b,1 ) 호출 시, mul 함수는 총 b-1 번 재귀 호출됨
따라서 O(b)의 시간복잡도를 가짐
실행 시간은 0.5초
1초에 연산횟수 1억번이라고 했을 때 5000번의 연산정도만 할 수 있는데 문제에서 b는 20억까지 될 수 있다.
즉, b가 너무 크면 재귀 호출이 너무 깊어지고 실행 속도가 느려진다.
이를 개선하기 위해 분할 정복을 활용한 빠른 거듭 제곱 (Exponentiation by Squaring)
시간복잡도 : O(b) → O(log b)
import sys
input = sys.stdin.read
def mul(a,b,c) :
if b == 0 :
return 1
half = mul(a, b//2, c)
half = (half * half) % c
return (half * a) % c if b % 2 else half
a,b,c = map(int, input().split())
print(mul(a,b,c))
'코딩 테스트 > 백준' 카테고리의 다른 글
[Python] 백준 2577 숫자의 개수 (0) | 2025.02.07 |
---|---|
[Python] 백준 2667 단지번호붙이기 (0) | 2025.02.07 |
[Python] 백준 14940 쉬운 최단거리 (1) | 2025.02.05 |
[Python] 백준 17478 재귀함수가 뭔가요? (1) | 2025.02.05 |
[Python] 백준 2675 문자열 반복 (0) | 2025.02.05 |