Notice
Recent Posts
Recent Comments
Link
REC
백준 1629번: 곱셈 (S1) - Python 풀이 본문
SMALL
문제 설명
https://www.acmicpc.net/problem/1629
자연수 A를 B번 곱한 수를 알고 싶다. 단 구하려는 수가 매우 커질 수 있으므로 이를 C로 나눈 나머지를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.
출력
첫째 줄에 A를 B번 곱한 수를 C로 나눈 나머지를 출력한다.
예제 입력 1
10 11 12
예제 출력 1
4
풀이 과정
이 문제의 핵심 아이디어는 지수를 반씩 줄여서 계산한다라는 것입니다.
예를 들어 a^8은 a를 8번 곱한 값으로, (a^4) * (a^4) 과 같고, a^4는 (a^2) * (a^2) 와 같습니다.
a^(2k) = (a^k)^2 성질을 이용해 지수를 절반으로 줄여서 계산하면, 곱하는 값이 양쪽이 같으니까 하나만 구하면 됩니다. 즉, 필요한 곱셈 횟수가 B번에서 log B번으로 줄어듭니다.
정답 코드
# 입력
A, B, C = map(int, input().split())
# 재귀
# 구하고자 하는 값 a^b%c
def recursive(a, b, c):
# b(거듭제곱 남은 횟수)가 0이 되면 함수 종료
if b == 0:
# 곱셈으로 이루어져 있으니까 1을 반환 (a^0 = 1 이기도 함)
return 1
# b를 반으로 나눈 몫을 가지고 재귀 호출
half_power = recursive(a, b//2, c)
# half_power는 지수가 절반으로 줄어든 결과이기 때문에 제곱한 값에 %c 한 값이 원래 지수
half_power = half_power * half_power % c
# b가 짝수(2k)면 half_power 반환
if b % 2 == 0:
return half_power
# b가 홀수(2k+1)면 half_power까지만 하면 지수가 하나 부족해서 a를 한번 더 곱해줘야 함
else:
return a * half_power % c
print(recursive(A, B, C))
- 파이썬에서 // 연산자는 정수 나눗셈(Floor Division, 몫 연산자) 입니다.
- 즉, 두 수를 나누고 소수점 이하를 버린 몫만 반환합니다. 이때, 단순히 버리는 게 아니라 내림(floor) 연산을 적용합니다.
이상입니다.
LIST
'Algorithm' 카테고리의 다른 글
백준 9251번: LCS (G5) - Python 풀이 (0) | 2025.09.05 |
---|---|
백준 1916번: 최소비용 구하기 (G5) - Python 풀이 (0) | 2025.09.04 |
백준 1027번: 고층 건물 (G4) - Python, Swift 풀이 (0) | 2025.08.24 |
백준 1932번: 정수 삼각형 (S1) - Python 풀이 (2) | 2025.08.16 |
백준 15666번: N과 M (12) (S2) - Python 풀이 (0) | 2025.08.12 |