반응형
-개인적인 풀이일 뿐, 최적의 정답이 아님을 알려드립니다.
문제
난이도: 실버 1
사용언어: JAVA
풀이
기본적인 문제의 풀이는 아래의 문제와 같습니다.
단지 마지막에 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
41
42
43
44
45
46
|
import java.io.*;
import java.util.Arrays;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int i;
int[] arr = new int[N + 1]; // 다이나믹 프로그래밍을 위한 배열
int[] log = new int[N + 1]; // 경로 추적을 위한 배열
Arrays.fill(arr, Integer.MAX_VALUE);
arr[0] = 0;
arr[1] = 0;
for (i = 2; i <= N; i++) {
if (i % 3 == 0) { // 3으로 나누어 떨어지면
arr[i] = arr[i / 3] + 1; // 저장
log[i] = i / 3;
}
if (i % 2 == 0) {
if (arr[i] > arr[i / 2] + 1) { // 2로 나누어 떨어지면서 연산 횟수가 3으로 나눌 때 보다 작다면
arr[i] = arr[i / 2] + 1;
log[i] = i / 2;
}
}
if (arr[i] > arr[i - 1] + 1) { // 1을 뺐을 때의 연산 횟수가 2나 3으로 나눌 때 보다 작다면
arr[i] = arr[i - 1] + 1;
log[i] = i - 1;
}
}
bw.write(String.valueOf(arr[N]) + "\n"); // 최소 연산 횟수 출력
i = N;
bw.write(String.valueOf(N) + " ");
while (i > 1) {
bw.write(String.valueOf(log[i]) + " ");
i = log[i];
} // 경로 추적
bw.flush();
bw.close();
br.close();
}
}
|
cs |
반응형
'백준 온라인 저지 > Silver' 카테고리의 다른 글
[BOJ] 9465 - 스티커 (0) | 2021.03.08 |
---|---|
[BOJ] 16953 - A → B (0) | 2021.02.25 |
[BOJ] 1463 - 1로 만들기 (0) | 2021.02.25 |
[BOJ] 3986 - 좋은 단어 (0) | 2021.02.24 |
[BOJ] 11399 - ATM (0) | 2021.02.23 |