728x90
https://www.acmicpc.net/problem/1629
< 문제 풀이 >
* 일반적인 재귀 호출 ( 브루트 포스 ) 식으로 풀면 시간 초과남
* 분할정복 알고리즘으로 푸는 것이 더 효율적
※ 일반적인 재귀 호출과 다른 점은 문제를 한 조각과 나머지 전체로 나누는 대신 거의 같은 크기의 부분 문제로 나누는 것
┌ 일반적 재귀 호출 -- 한 조각과 나머지로 쪼갬
└ 분할 정복 -- 문제를 절반씩으로 나눔
( 출처 : 알고리즘 문제 해결 전략 )
import java.util.Scanner;
public class Main {
static long a, b, c;
public static long pow( int k ) {
if( k == 1 ) return a % c;
long p = pow( k / 2 );
long res = ( p * p ) % c;
res = k % 2 == 1 ? ( res * a ) % c : res;
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
a = sc.nextInt();
b = sc.nextInt();
c = sc.nextInt();
sc.close();
System.out.println( pow( (int)b ) );
}
}
반응형
'코딩 문제 풀기 ( Algorithm problem solving ) > 백준 온라인 저지 ( BOJ )' 카테고리의 다른 글
[백준(Baekjoon)][자바(java)] 2740 : 행렬 곱셈 / 분할 정복 (0) | 2020.08.26 |
---|---|
[백준(Baekjoon)][자바(java)] 11401 : 이항 계수 3 / 분할 정복 (0) | 2020.08.26 |
[백준(Baekjoon)][자바(java)] 1780 : 종이의 개수 / 분할 정복 (0) | 2020.08.26 |
[백준(Baekjoon)][자바(java)] 1992 : 쿼드트리 / 분할 정복 (0) | 2020.08.26 |
[백준(Baekjoon)][자바(java)] 2630 : 색종이 만들기 / 분할 정복 (0) | 2020.08.26 |