일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 2월
- 개인 프로젝트 - 런앤건
- 2022년
- 개인 프로젝트
- 1월
- 유니티
- 다이나믹 프로그래밍
- 자료 구조
- 골드메탈
- 게임 엔진 공부
- 4월
- 유니티 심화과정
- 입문
- c++
- 백준
- 코딩 테스트
- 기초
- 프로그래머스
- 3월
- 2025년
- 단계별로 풀어보기
- 2023년
- 10월
- 5월
- 코딩 기초 트레이닝
- 6월
- C/C++
- todolist
- 수학
- 2024년
- Today
- Total
기록 보관소
[Baekjoon/백준] 1629번: 곱셈(C/C++) 본문
단계별로 풀어보기 20단계(분할 정복) 4번 문제
https://www.acmicpc.net/step/20
분할 정복 단계
히스토그램에서 가장 큰 직사각형을 찾는 문제. (※인터넷에 널리 알려져 있는 풀이와 달리, 분할 정복 과정에서 어떠한 자료구조도 필요 없습니다.)
www.acmicpc.net
백준 1629번: 곱셈
https://www.acmicpc.net/problem/1629
1629번: 곱셈
첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.
www.acmicpc.net
문제 설명
자연수 A를 B번 곱한 수를 알고 싶다. 단 구하려는 수가 매우 커질 수 있으므로 이를 C로 나눈 나머지를 구하는 프로그램을 작성하시오.
입력과 출력
입력: 첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.
출력: 첫째 줄에 A를 B번 곱한 수를 C로 나눈 나머지를 출력한다.

접근 방법
이번 문제는 자연수 A, B, C를 입력받고, A^B / C의 나머지를 출력하는 문제다.
단순하게 생각하면 반복문을 통해서 A^B 연산을 하고, % 연산자로 C로 나눈 나머지를 구하면 되겠지만, 입력 조건에서 보이듯이 숫자가 최대 21억으로 매우 크고, 이를 제곱해야 하므로 일반적인 연산을 한다면 무조건 시간 초과가 발생할 것이다.
따라서 재귀를 통한 분할정복으로 제곱을 구해서 문제를 해결해야한다. 우선 A^B에서 B가 0일경우 A 값에 상관없이 무조건 1이 된다. 그리고 B가 1이라면, A가 된다. 이점을 이용해서 A^B를 계속 분해하면서 재귀를 해주면 된다.
A^B를 분해하는 것은 B가 짝수인지 홀수인지로 나뉜다. B가 짝수라면 B를 반으로 나눠서 재귀를 해주고, B가 홀수라면 A^B = A * A ^ (B-1)로 분해하면 된다. 이를 계속 반복하면서 나온 값을 C로 나눠주면 문제를 해결할 수 있다.
개인적으로 이런 수학 문제는 진짜 너무 어렵고 까다로워서 이 블로그 글을 참고해서 진행했다. 아마 다음 문제들도 다 수학 문제들이라서... 비슷하게 진행될 것 같다.
코드
#include <iostream>
using namespace std;
long long int pow(long long int A, long long int B, long long int C) {
if (B == 0) return 1;
if (B == 1) return A;
if (B % 2 != 0)
return A * pow(A, B - 1, C);
long long int temp = pow(A, B / 2, C);
temp %= C;
return (temp * temp) % C;
}
int main(int argc, char *argv[]) {
long long int A, B, C;
cin >> A >> B >> C;
cout << pow(A, B, C) % C << endl;
return 0;
}
결과

'코딩 테스트 > 백준' 카테고리의 다른 글
[Baekjoon/백준] 2740번: 행렬 곱셈(C/C++) (0) | 2022.05.07 |
---|---|
[Baekjoon/백준] 11401번: 이항 계수 3(C/C++) (0) | 2022.05.06 |
[Baekjoon/백준] 1780번: 종이의 개수(C/C++) (0) | 2022.04.29 |
[Baekjoon/백준] 1992번: 쿼드트리(C/C++) (0) | 2022.04.27 |
[Baekjoon/백준] 2630번: 색종이 만들기(C/C++) (0) | 2022.04.24 |