File tree Expand file tree Collapse file tree 2 files changed +90
-0
lines changed
백준/Silver/12852. 1로 만들기 2 Expand file tree Collapse file tree 2 files changed +90
-0
lines changed Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+
You can’t perform that action at this time.
0 commit comments