Skip to content

Commit 31dffc9

Browse files
committed
[Silver I] Title: 1로 만들기 2, Time: 132 ms, Memory: 21968 KB -BaekjoonHub
1 parent 92afdcf commit 31dffc9

File tree

2 files changed

+90
-0
lines changed

2 files changed

+90
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import java.io.*;
2+
3+
public class Main {
4+
public static void main(String[] args) throws IOException {
5+
6+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
7+
8+
int N = Integer.parseInt(br.readLine());
9+
int dp[] = new int[N+1];
10+
int[] path = new int[N + 1];
11+
12+
dp[1] =0;
13+
path[1] = 0;
14+
15+
if(N>=2) {
16+
dp[2] =1;
17+
path[2] = 1;
18+
}
19+
20+
if(N>=3) {
21+
dp[3] =1;
22+
path[3] =1;
23+
}
24+
25+
26+
for(int i =4; i<=N; i++) {
27+
28+
dp[i] = dp[i-1]+1;
29+
path[i] = i-1;
30+
31+
if(i%3 ==0 && dp[i] > dp[i/3]+1) {
32+
dp[i] =dp[i/3] +1;
33+
path[i] = i/3;
34+
}
35+
if(i%2 ==0 && dp[i] > dp[i/2]+1) {
36+
dp[i] = dp[i/2]+1;
37+
path[i]= i/2;
38+
}
39+
}
40+
int answer = dp[N];
41+
StringBuilder sb = new StringBuilder();
42+
System.out.println(answer);
43+
44+
int current = N;
45+
while(current > 0 ) {
46+
sb.append(current).append(" ");
47+
current = path[current];
48+
}
49+
50+
System.out.println(sb);
51+
}
52+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# [Silver I] 1로 만들기 2 - 12852
2+
3+
[문제 링크](https://www.acmicpc.net/problem/12852)
4+
5+
### 성능 요약
6+
7+
메모리: 21968 KB, 시간: 132 ms
8+
9+
### 분류
10+
11+
다이나믹 프로그래밍, 그래프 이론, 그래프 탐색
12+
13+
### 제출 일자
14+
15+
2024년 11월 27일 13:32:33
16+
17+
### 문제 설명
18+
19+
<p>정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.</p>
20+
21+
<ol>
22+
<li>X가 3으로 나누어 떨어지면, 3으로 나눈다.</li>
23+
<li>X가 2로 나누어 떨어지면, 2로 나눈다.</li>
24+
<li>1을 뺀다.</li>
25+
</ol>
26+
27+
<p>정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.</p>
28+
29+
### 입력
30+
31+
<p>첫째 줄에 1보다 크거나 같고, 10<sup>6</sup>보다 작거나 같은 자연수 N이 주어진다.</p>
32+
33+
### 출력
34+
35+
<p>첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.</p>
36+
37+
<p>둘째 줄에는 N을 1로 만드는 방법에 포함되어 있는 수를 공백으로 구분해서 순서대로 출력한다. 정답이 여러 가지인 경우에는 아무거나 출력한다.</p>
38+

0 commit comments

Comments
 (0)