문제
설명
가장 윗줄에 1부터 N까지의 숫자가 한 개씩 적혀 있다. 그리고 둘째 줄부터 차례대로 파스칼의 삼각형처럼 위의 두개를 더한 값이 저장되게 된다.
예를 들어 N이 4 이고 가장 윗 줄에 3 1 2 4 가 있다고 했을 때, 다음과 같은 삼각형이 그려진다.
N과 가장 밑에 있는 숫자가 주어져 있을 때 가장 윗줄에 있는 숫자를 구하는 프로그램을 작성하시오.
단, 답이 여러가지가 나오는 경우에는 사전순으로 가장 앞에 오는 것을 출력하여야 한다.
입력
첫째 줄에 두개의 정수 N(1≤N≤10)과 F가 주어진다.
N은 가장 윗줄에 있는 숫자의 개수를 의미하며 F는 가장 밑에 줄에 있는 수로 1,000,000 이하이다.
출력
첫째 줄에 삼각형에서 가장 위에 들어갈 N개의 숫자를 빈 칸을 사이에 두고 출력한다.
답이 존재하지 않는 경우는 입력으로 주어지지 않는다.
예시 입력 1
4 16
예시 출력 1
3 1 2 4
내 풀이
import java.util.Scanner;
public class Main8_8 {
static int n, f;
static String tmp="";
public void DFS(int L, int a, int sum){
if(a==1 && L<n) return;
if(L==n){
tmp += a + " ";
}
else {
for (int i = 1; i < sum; i++) {
DFS(L+1, i, i);
DFS(L+1, sum-i, sum-i);
}
}
}
public static void main(String[] args) {
Main8_8 T = new Main8_8();
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
f = sc.nextInt();
}
}
어림도 없는 코드ㅋㅋㅋㅋㅋㅋ 규칙이 정해져 있을 줄이야,,,,^^ 오랜만에 헤매다 결국 강의행.
선생님 풀이
이 문제에는 규칙이 숨어 있었다.
위의 두개를 더한 값을 맨 마지막까지 구하게 되면 3은 1번, 1은 3번, 2는 3번, 4은 1번 쓰이게 되는데
그 값은 n-1C0, n-1C1, n-1C2, n-1C3이다 !!
따라서 1~n까지의 순열을 구해, 각 자리의 수에 n-1C0, n-1C1, n-1C2, ~ n-1Cn-1를 곱해 f가 되는지 확인하면 된다.
위 예시에서는 3x1 + 1x3 + 2x3 + 4x1 = 16으로 정답
import java.util.Scanner;
public class Main8_8 {
static int n, f;
static int[] b, p, ch;
boolean flag = false;
int[][] dy = new int[35][35];
public int combi(int n, int r){
if(dy[n][r]>0) return dy[n][r];
if(n==r || r==0) return 1;
else return dy[n][r] = combi(n-1, r-1) + combi(n-1, r);
}
public void DFS(int L, int sum){
if(flag) return; //답을 찾았을 때 스택에 남은 것들을 더이상 호출하지 않고 종료하기 위함
if(L==n){
if(sum==f) {
for(int x : p) System.out.print(x + " ");
flag = true;
}
}
else {
for (int i = 1; i <= n; i++) {
if(ch[i]==0) {
ch[i]=1;
p[L]=i;
DFS(L+1, sum+b[L]*p[L]);
ch[i]=0;
}
}
}
}
public static void main(String[] args) {
Main8_8 T = new Main8_8();
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
f = sc.nextInt();
b = new int[n];
p = new int[n];
ch = new int[n+1];
for (int i = 0; i < n; i++) {
b[i] = T.combi(n-1, i);
}
T.DFS(0, 0);
}
}
결과
'Algorithm > Inflearn' 카테고리의 다른 글
[Inflearn] 자바 알고리즘 문제풀이 #08-10 10. 미로탐색(DFS) (0) | 2023.04.24 |
---|---|
[Inflearn] 자바 알고리즘 문제풀이 #08-09 9. 조합 구하기(DFS) (0) | 2023.04.24 |
[Inflearn] 자바 알고리즘 문제풀이 #08-07 7. 조합의 경우수(DFS, 메모이제이션) (1) | 2023.04.17 |
[Inflearn] 자바 알고리즘 문제풀이 #08-05 5. 동전교환(DFS) (0) | 2023.04.13 |
[Inflearn] 자바 알고리즘 문제풀이 #08-04 4. 중복순열 구하기(DFS) (0) | 2023.04.12 |