728x90
반응형
이 문제는 dp를 사용하는 문제입니다.
N부터 시작하여 1까지 내려가는 과정에서
숫자를 만드는데 필요한 횟수를 메모제이션 합니다.
1. 1을 빼는 경우를 계산
2. 2로 나누어 떨어지는 경우 1을 뺀 경우와 비교하여 더 작은 값을 찾음.
3. 으로 떨어지는 경우 1을 뺀 경우와 비교하여 더 작은 값을 찾음.
각각에서 +1을 하는 경우는 1을 뺀 경우, 2로 나눈 경우, 3으로 나눈 경우를 더해주는 것 입니다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] dp = new int[n+1];
dp[0] = dp[1] = 0;
for(int i=2; i<=n; i++) {
dp[i] = dp[i-1] + 1; // 1을 뺀다.
if(i % 2 == 0) dp[i] = Math.min(dp[i], dp[i/2] + 1); // 2로 나누어 떨어지는 경우
if(i % 3 == 0) dp[i] = Math.min(dp[i], dp[i/3] + 1); // 3로 나누어 떨어지는 경우
}
System.out.println(dp[n]);
}
}
728x90
반응형
'프로그래밍_백준 > Java' 카테고리의 다른 글
*Java) 2579번 계단 오르기 (dp) (0) | 2024.01.18 |
---|---|
Java) 백준 1003번 피보나치 함수 (DP) (0) | 2024.01.09 |
Java) 백준 1874 스택 수열 (0) | 2024.01.05 |
*Java) 백준 1966번 프린터 큐 (1) | 2024.01.03 |
Java) 1764 듣보잡 (0) | 2023.09.16 |