Recursion, Memoization_ํผ๋ณด๋์น
๐ต ThingsILearned
โ๏ธ ๋ฉ๋ชจ์ด์ ์ด์
์ปดํจํฐ ํ๋ก๊ทธ๋จ์ด ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณตํด์ผ ํ ๋,
์ด์ ์ ๊ณ์ฐํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํจ์ผ๋ก์จ ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณต ์ํ์ ์ ๊ฑฐํ์ฌ ํ๋ก๊ทธ๋จ ์คํ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ ๊ธฐ์
๋์ ๊ณํ๋ฒ์ ํต์ฌ์ด ๋๋ ๊ธฐ์
https://soheeparklee.github.io/posts/DS-memoization/
โ Recursion, Memoization์ ์ฌ์ฉํด์ ํผ๋ณด๋์น ๋ฐฐ์ด์ ์ถ๋ ฅํ์ธ์
1
2
3
4
//โญ๏ธinput:
//7
//โญ๏ธoutput:
//1 1 2 3 5 8 13
๐ข ๋จ์ ์ฌ๊ท๋ฅผ ์ฌ์ฉํด์ ํ๊ธฐ 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Main {
public int DFS(int n){
if(n<=1) return n;
else{
return DFS(n-2) + DFS(n-1);
}
}
public static void main(String[] args) {
Main T = new Main();
Scanner sc= new Scanner(System.in);
int n= sc.nextInt();
for(int i=1; i<=n; i++){
System.out.print(T.DFS(i) + " ");
}
}
}
๐ข ๋จ์ ์ฌ๊ท๋ฅผ ์ฌ์ฉํด์ ํ๊ธฐ 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Main {
public int DFS(int n){
if(n==1) return 1;
else if(n==2) return 1;
else{
return DFS(n-2) + DFS(n-1);
}
}
public static void main(String[] args) {
Main T = new Main();
Scanner sc= new Scanner(System.in);
int n= sc.nextInt();
for(int i=1; i<=n; i++){
System.out.print(T.DFS(i) + " ");
}
}
}
//โญ๏ธinput:
//7
//โญ๏ธoutput:
//1 1 2 3 5 8 13
๐๐ป ์ฌ๊ท๋ง์ ์ฌ์ฉํ์ ๋ ํ๊ณ
ํ๋ํ๋์ฉ ๊ณ์ฐํด์ ์ถ๋ ฅํ๋ค๋ณด๋
์ซ์ ํ๋ ๋์ค๊ณ โฆ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ค์ ์ซ์ ๋์ค๊ณ โฆ๋ ๊ธฐ๋ค๋ฆฌ๊ณ โฆ
๋๊น์ง ์ถ๋ ฅํ๋๋ฐ ์ค๋ ๊ฑธ๋ฆผ
๐ข ์ฌ๊ท ์ฌ์ฉํ๊ณ , ๋ฐฐ์ด์ ๊ฐ ์ ์ฅํด์ ๊ฐ์ ธ์ค๊ธฐ
๐๐ป ๋ฐฐ์ด์ ๊ฐ ์ ์ฅํ๋ ์ด์
๋ฐฐ์ด์ ๊ฐ์ ์ ์ฅํ์ง ์๊ณ ๋จ์ ์ฌ๊ท๋ง์ ์ฌ์ฉํด์ ํ๋ฆฐํธํ๋ฉด
๊ฐ ํ๋ ๋์ค๊ณ โฆ๊ณ์ฐํด์ ๋ค์โฆ๋ ๊ณ์ฐํด์ ๋ค์โฆํ๋ค๋ณด๋
ํ๋์ ๊ฐ์ ์ป๊ณ ๊ทธ ๋ค์ ๊ฐ์ ์ป๊ธฐ๊น์ง ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆผ.
๋ฐฐ์ด์ ๋ชจ๋ ๊ฐ์ ์ ์ฅํ๊ณ ํ๋ฒ์ ํ๋ฆฐํธํ๋ฉด,
์ฒ์์ ๋ชจ๋ ๊ฐ์ ๊ณ์ฐํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ผ๋
ํ๋ฒ์ ๋ชจ๋ ๊ฐ์ ์ถ๋ ฅํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
๐ก ์ฃผ์: ๋ฐฐ์ด์ ํฌ๊ธฐ๋ n+1
์ฐ๋ฆฌ๋ ๋ฐฐ์ด์ 0๋ฒ์งธ ์ธ๋ฑ์ค๋ ์ฌ์ฉํ์ง๋ฅผ ์๋๋ค. ๋ฐ๋ผ์ ๋ฐฐ์ด์ 0๋ฒ์งธ ์ธ๋ฑ์ค๋ ๋ฒ๋ฆฌ๊ณ , ๋์ n๊ฐ ๋งํผ์ ์๋ฆฌ๊ฐ ํ์ํ๋ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ n+1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Main {
static int[] fibo; //๋ฐฐ์ด ์์ฑ
public int DFS(int n){
if(n==1) return fibo[n]= 1;
else if(n==2) return fibo[n]= 1;
else{
return fibo[n]= DFS(n-2) + DFS(n-1);
}
}
public static void main(String[] args) {
Main T = new Main();
Scanner sc= new Scanner(System.in);
int n= sc.nextInt();
fibo= new int[n+1]; //๋ฐฐ์ด์ ํฌ๊ธฐ๋ n+1
T.DFS(n);
for(int i=1; i<=n; i++){
System.out.print(fibo[i] + " ");
}
}
}
โ ๋ฉ๋ชจ์ด์ ์ด์ ๊ณผ ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํด ๋น ๋ฅด๊ฒ ํผ๋ณด๋์น ๊ตฌํ๊ธฐ
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
class Main {
static int[] fibo;
public int DFS(int n){
//memoization
//๋ฐฐ์ด์ ์ด๋ฏธ ๊ณ์ฐํด ๋ ๊ฐ์ด ์๋์ง ํ์ธํ๊ณ , ์์ผ๋ฉด ๊ตณ์ด ๋๊ฐ์ ๊ณ์ฐ์ ๋ ๋ฒ ํ์ง๋ ์์
if(fibo[n] != 0) return fibo[n];
if(n==1) return fibo[n]= 1;
else if(n==2) return fibo[n]= 1;
else{
return fibo[n]= DFS(n-2) + DFS(n-1);
}
}
public static void main(String[] args) {
Main T = new Main();
Scanner sc= new Scanner(System.in);
int n= sc.nextInt();
fibo= new int[n+1]; //์๋ก ๋ฐฐ์ด์ ๋ง๋ค๋ฉด ์ฒ์์๋ ๋ค 0์ผ๋ก ์ด๊ธฐํ ๋จ
T.DFS(n);
for(int i=1; i<=n; i++){
System.out.print(fibo[i] + " ");
}
}
}
//โญ๏ธinput:
//7
//โญ๏ธoutput:
//1 1 2 3 5 8 13
๐๐ป ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ์ฉ
n ์ซ์๊ฐ ์ปค์ง์๋ก ์๊ฐ์ด ์์ฒญ ์ค๋ ๊ฑธ๋ฆฐ๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค.
์๋ฅผ ๋ค์ด n ์ด 45๋ผ๋ฉด, ๊ฐ์ง์ณ์ ๊ตฌํ๋ ํฉ์ด ์์ฒญ ๋ง์ ๊ฒ์ด๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฉ๋ชจ์ด์ ์ด์
์ ์ฌ์ฉํ๋ค.
๋ฉ๋ชจ์ด์ ์ด์
์ ํ๋ฉด ์ด๋ฏธ ๊ณ์ฐํ ๊ฐ์ ๋ฐฐ์ด์ ์ ์ฅํ์์ผ๋,
๊ฐ์ ๊ณ์ฐํ๊ธฐ ์ ์ ์ด๋ฏธ ๋ฐฐ์ด์ ๊ณ์ฐํด ๋ ๊ฐ์ด ์๋์ง ํ์ธํ๋ค.