Skip to content

Commit dcb0830

Browse files
committed
[Silver I] Title: 수들의 합 6, Time: 216 ms, Memory: 47732 KB -BaekjoonHub
1 parent e4bdac0 commit dcb0830

File tree

2 files changed

+99
-0
lines changed

2 files changed

+99
-0
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
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+
}

0 commit comments

Comments
 (0)