반응형
https://www.acmicpc.net/problem/1463
[풀이과정]
DP문제. N을 index로 두고
DP[N]를
1 ) 3으로 나뉠 때 -> DP[N/3] + 1
2 ) 2로 나뉠 때 -> DP[N/2] + 1
3 ) -1 할 때 -> DP[N-1] + 1
3가지 중 가장 작은 값으로 갱신하며 채우기.
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/*
1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
2. X가 2로 나누어 떨어지면, 2로 나눈다.
3. 1을 뺀다.
*/
public class Main{
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int N;
static int[] DP;
public static void main(String[] args) throws IOException {
init();
DP(N);
/*
[출력]
연산을 하는 횟수의 최솟값
*/
System.out.println(DP[1]);
}
static void init() throws IOException{
/*
[입력]
1. N (1<=N<=1,000,000)
*/
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
DP = new int[N+1];
}
static void DP(int num){
DP[1] = 0;
DP[2] = 1;
DP[3] = 1;
for(int n = 4; n <= num; n++) {
DP[n] = 1 + DP[n-1];
//3으로 나누어지면
if(n % 3 == 0)
DP[n] = Math.min(DP[n], 1 + DP[n/3]);
if(n % 2 == 0)
DP[n] = Math.min(DP[n], 1 + DP[n/2]);
}
}
}
반응형
'알고리즘 > DP' 카테고리의 다른 글
[백준] 16139 : 인간컴퓨터상호작용 (JAVA) (0) | 2025.04.23 |
---|---|
[백준] 11048 : 이동하기 (JAVA) (0) | 2025.04.23 |
[백준] 11726 : 2 x n 타일링 (JAVA) (0) | 2025.04.03 |
[백준] 2631 : 줄세우기 (JAVA) (0) | 2025.03.25 |
[백준] 22869 : 징검다리 건너기 (JAVA) (0) | 2025.03.24 |