File tree Expand file tree Collapse file tree 2 files changed +99
-0
lines changed
Expand file tree Collapse file tree 2 files changed +99
-0
lines changed Original file line number Diff line number Diff line change 1+ # [ Silver I] 수들의 합 6 - 1821
2+
3+ [ 문제 링크] ( https://www.acmicpc.net/problem/1821 )
4+
5+ ### 성능 요약
6+
7+ 메모리: 47732 KB, 시간: 216 ms
8+
9+ ### 분류
10+
11+ 수학, 브루트포스 알고리즘, 백트래킹
12+
13+ ### 제출 일자
14+
15+ 2025년 10월 9일 21:00:01
16+
17+ ### 문제 설명
18+
19+ <p >가장 윗줄에 1부터 N까지의 숫자가 한 개씩 적혀 있다. 그리고 둘째 줄부터 차례대로 파스칼의 삼각형처럼 위의 두개를 더한 값이 저장되게 된다. 예를 들어 N이 4 이고 가장 윗 줄에 3 1 2 4 가 있다고 했을 때, 다음과 같은 삼각형이 그려진다.</p >
20+
21+ <pre >3 1 2 4
22+ 4 3 6
23+ 7 9
24+ 16</pre >
25+
26+ <p >N과 가장 밑에 있는 숫자가 주어져 있을 때 가장 윗줄에 있는 숫자를 구하는 프로그램을 작성하시오. 단, 답이 여러 가지가 나오는 경우에는 사전순으로 가장 앞에 오는 것을 출력하여야 한다.</p >
27+
28+ ### 입력
29+
30+ <p >첫째 줄에 두개의 정수 N(1 ≤ N ≤ 10)과 F가 주어진다. N은 가장 윗줄에 있는 숫자의 개수를 의미하며 F는 가장 밑에 줄에 있는 수로 1,000,000 이하인 자연수이다.</p >
31+
32+ ### 출력
33+
34+ <p >첫째 줄에 삼각형에서 가장 위에 들어갈 N개의 숫자를 빈 칸을 사이에 두고 출력한다. 답이 존재하지 않는 경우는 입력으로 주어지지 않는다.</p >
35+
Original file line number Diff line number Diff line change 1+ import java .io .*;
2+ import java .util .*;
3+
4+ public class Main {
5+
6+ static boolean flag ;
7+ static int n , k ;
8+ static int [] number , selected ;
9+ static boolean [] visited ;
10+ static StringTokenizer st ;
11+ static StringBuilder sb = new StringBuilder ();
12+ static BufferedReader br = new BufferedReader (new InputStreamReader (System .in ));
13+ static BufferedWriter bw = new BufferedWriter (new OutputStreamWriter (System .out ));
14+ public static void main (String [] args ) throws Exception {
15+ inputSetting ();
16+ perm (0 );
17+ bw .append (sb );
18+ bw .close ();
19+ }
20+ static void findQArray (int [] arr ){
21+ int size = n ;
22+
23+ while (0 < size ){
24+ for (int i = 0 ; i < size - 1 ; i ++){
25+ arr [i ] = arr [i ] + arr [i + 1 ];
26+ }
27+ size --;
28+ }
29+ if (arr [0 ] == k ) {
30+ flag = true ;
31+ for (int i = 0 ; i < n ; i ++) sb .append (selected [i ]).append (" " );
32+ }
33+ }
34+
35+ static void perm (int cnt ){
36+ if (flag ) return ;
37+
38+ if (cnt == n ){
39+ findQArray (selected .clone ());
40+ return ;
41+ }
42+
43+ for (int i = 0 ; i < n ; i ++){
44+ if (visited [i ]) continue ;
45+
46+ visited [i ] = true ;
47+ selected [cnt ] = number [i ];
48+ perm (cnt + 1 );
49+ visited [i ] = false ;
50+ }
51+ }
52+
53+ static void inputSetting () throws Exception {
54+ st = new StringTokenizer (br .readLine ());
55+
56+ n = Integer .parseInt (st .nextToken ());
57+ k = Integer .parseInt (st .nextToken ());
58+
59+ number = new int [n ];
60+ selected = new int [n ];
61+ visited = new boolean [n ];
62+ for (int i = 0 ; i < n ; i ++) number [i ] = i + 1 ;
63+ }
64+ }
You can’t perform that action at this time.
0 commit comments