https://www.acmicpc.net/problem/1463
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
문제
풀이
만약 구하고 싶은 수를 i 라고 하면 , min( dp[i/2]+1 , dp[i/3]+1 , dp[i-1]+1 ) 이라는 최적해를 구해서 하면된다.
연산 순서에 따라 완전 다른 횟수가 나올 수 있기 때문에 그리디로 접근하면 x
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
|
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] dp = new int[10000001];
dp[0] = dp[1]=0;
for(int i=2;i<=n;i++){
dp[i] = dp[i-1]+ 1;
if(i%3 == 0)
dp[i] = Math.min(dp[i/3] +1,dp[i]);
if(i%2 == 0)
dp[i] = Math.min(dp[i/2] +1, dp[i]);
}
System.out.println(dp[n]);
}
}
|
cs |
https://www.acmicpc.net/problem/12852
12852번: 1로 만들기 2
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 자연수 N이 주어진다.
www.acmicpc.net
문제
아까 문제랑 동일하다 , 여기에 계산 과정까지 적어주면 된다.
풀이
dp[] 배열과 똑같은 크기의 arr[] 배열을 하나 더 생성 한 다음 , 조건을 만족할 때 arr[i] = i/3 or i/2 or i-1 같이
연속 인덱싱 시켜주면 끝.
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
31
32
33
34
35
36
37
38
39
40
|
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] dp = new int[10000001];
dp[0] = dp[1]=0;
int[] arr = new int[10000001];
for(int i=2;i<=n;i++){
dp[i] = dp[i-1]+ 1;
arr[i] = i-1;
if(i%3 == 0) {
if(dp[i/3]+1 < dp[i]){
dp[i] = dp[i/3]+1;
arr[i] = i/3;
}
}
if(i%2 == 0) {
if(dp[i/2]+1 < dp[i]){
dp[i] = dp[i/2]+1;
arr[i] = i/2;
}
}
}
System.out.println(dp[n]);
while(n>0){
System.out.print(n+" ");
n = arr[n];
}
}
}
|
cs |
'알고리즘,PS > 백준' 카테고리의 다른 글
[BOJ] 백준 [2579] 계단 오르기 JAVA (0) | 2021.09.16 |
---|---|
[BOJ] 백준 [2156] 포도주 시식 JAVA (0) | 2021.09.15 |
[BOJ] 백준 [1946] 신입사원 JAVA (0) | 2021.09.13 |
[BOJ] 백준 [2252] 줄 세우기 JAVA (0) | 2021.09.09 |
[BOJ] 백준 [1197] 최소 스패닝 트리 JAVA (0) | 2021.09.09 |