728x90
반응형

문제 요약
- 알고리즘 분류: 재귀호출, 분할정복
- 난이도: Silver1
- 문제내용:
- A 를 B 번 곱해서 C로 나눠서 출력한다.
- 사이트 주소: https://www.acmicpc.net/problem/1629
1629번: 곱셈
첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.
www.acmicpc.net
문제풀이
위 문제는 아래처럼 pow 함수 사용하거나 제곱으로 연산하거나 for문으로 사용하면 시간 초과가 나올것이다.
A, B, C = map(int, input().split())
# 그냥 제곱 연산으로 사용할 경우
result = A ** B % C
# for 문으로 사용할 경우
result = 1
for i in range(B):
result *= A
# pow 함수 사용할 경우
from math import pow
result = pow(A, B)
접근방법
재귀로 분할 해서 가져오면 O(logN)시간을 가져올수가 있다. 아래의 그림을 보면 이해 할수가 있다.'

A 제곱 B를 A 제곱 B/2 곱하기 2번하면 된다.

A 제곱 B/2도 A제곱 B/4 곱하기 2번하면된다.
하지만 B에서 2 로 나뉘어 나머지가 1인 경우도 생각해야한다. 그럴경우에는 아래와 같이 A를 한번 더 곱해주면된다.

정리 한다면 아래와 같이 정의 할수가 있다.

재귀 함수 적용 법
- 파라미터 값이 1일때는 A % C 로 리턴한다.
- 파라미터 값이 2이상인 경우 파라미터값을 2로 나눠서 함수 재호출 해서 값을 가져온다.
- 홀수 일때 재호출한 값을 제곱해서 A를 한번 더 곱한다음에 C 나머지 구한다.
- 짝수 일때 재호출한 값을 제곱해서 C 나머지 구한다.
코드
Python
def pow(n):
if n == 1:
return A % C
else:
result = pow(n // 2)
if n % 2 == 1:
return (result * result * A) % C
else:
return (result * result) % C
A, B, C = map(int, input().split())
print(pow(B))
728x90
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[BAEKJOON] 2004 조합 0의 개수 (1) | 2022.10.05 |
---|---|
[BAEKJOON] 1010 다리놓기 (0) | 2022.10.04 |
[BAEKJOON] 2744 대소문자 바꾸기 (0) | 2022.10.01 |
[BAEKJOON] 11051 이항 계수 2 (1) | 2022.09.30 |
[BAEKJOON] 1149 RGB거리 (1) | 2022.09.26 |