문제
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
알고리즘
다이나믹 프로그래밍(DP)
풀이
3가지 연산이 있을 때,
어떤 정수 X을 만드는 횟수의 최솟값을 make[X] 라고 한다면 그 값은 다음 세 값 중 최솟값일 것이다.
1. make[X / 3] + 1 (나누어 떨어지면)
2. make[X / 2] + 1 (나누어 떨어지면)
3. make[X - 1] + 1
따라서 2부터 X까지 위 연산을 적용하고, make[X]를 출력하면 된다.
코드
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] dp = new int[N + 1];
dp[1] = 0;
for (int i = 2; i <= N; i++) {
dp[i] = dp[i - 1] + 1;
if (i % 2 == 0 && dp[i / 2] + 1 < dp[i])
dp[i] = dp[i / 2] + 1;
if (i % 3 == 0 && dp[i / 3] + 1 < dp[i])
dp[i] = dp[i / 3] + 1;
}
System.out.println(dp[N]);
}
}
'Algorithm > 백준(BOJ)' 카테고리의 다른 글
[백준] 1202. 보석 도둑 (Java) (0) | 2022.10.10 |
---|---|
[백준] 12852. 1로 만들기 2 (Java) (0) | 2022.10.10 |
[백준] 1806. 부분합 (Java) (0) | 2022.10.10 |
[백준] 1854. K번째 최단경로 찾기 (Java) (0) | 2022.10.10 |
[백준] 19235. 모노미노도미노 (Java) (0) | 2022.10.10 |