수열 추측하기
✅ 어떤 수열을 더해서 최종 값이 나왔는지, 그 수열을 추측하세요
- 첫 줄에 n 개의 숫자가 적혀 있다.
- 둘째줄부터 옆에 있는 숫자끼리 더한다.
마지막 나온 값을 저장한다.
- 처음에 n 개의 숫자 개수와 최종값이 주어졌을 때,
- 처음에 주어진 숫자를 구하세요.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
class Main {
static int n; //주어진 숫자 개수
static int finalNum; //최종 합
static int[] answer; //1~n까지의 값 저장
static int[] ch; //1~n까지의 값 저장할 때 중복여부 확인
static int[] combiArr; //그 레벨 수 저장
boolean flag = false; //값 찾으면 끝내기
int[][] combiMemo = new int[35][35]; //메모이제이션
public int combi(int n, int r) { //nCr
if(combiMemo[n][r] >0) return combiMemo[n][r];
if(n==r || r==0) return 1;
else{
return combiMemo[n][r] = combi(n-1, r-1) + combi(n-1, r);
}
}
public void DFS(int L, int sum) {
if(flag) return;
if(L==n){ //complete
if(sum == finalNum){
for(int x: answer){
System.out.print(x+" ");
flag= true;
}
}
}
else{ //not complete
for(int i=1; i<=n; i++){
if(ch[i] ==0 ){
ch[i]=1;
answer[L] = i;
DFS(L+1, sum+ answer[L]*combiArr[L]);
ch[i]=0;
}
}
}
}
public static void main(String[] args) {
Main T = new Main();
Scanner sc = new Scanner(System.in);
n= sc.nextInt();
finalNum = sc.nextInt();
answer= new int[n];
combiArr= new int[n];
ch= new int[n+1];
for(int i=0; i<n; i++){
combiArr[i]= T.combi(n-1, i);
}
T.DFS(0, 0);
}
}
//⭐️input:
//4, 16
//⭐️output:
//3 1 2 4
🔵 ThingsILearned
✔️ variables
answer
: 주어진 n개의 숫자를 나열한 방법- (1,2,3,4) 또는 (3, 1, 2, 4) 등등
ch
:answer
배열을 나열할 때 이 숫자 썼는지 안 썼는지 확인하기 위해 필요combiArr
: 그 레벨의 수열 저장combiMemo
: 메모이제이션, 수열(nCr) 저장하고 똑같은 계산 두 번 하지 않도록
✔️ PSVM 함수
- 수열 값 계산해서
combiArr
에 저장한다.
✔️ combi 함수
- 수열 계산하는 함수
✔️ DFS 함수
This post is licensed under CC BY 4.0 by the author.