๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with Python]_28_๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ณธ๋ฌธ

๐Ÿฆฅ ์ฝ”ํ…Œ/์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with python

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with Python]_28_๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์ง•์ง•์•ŒํŒŒ์นด 2022. 2. 9. 01:39
728x90
๋ฐ˜์‘ํ˜•

220209 ์ž‘์„ฑ

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” ใ€Ž์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹คใ€ ์˜ youtube๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค>

https://www.youtube.com/watch?v=rWbjQphRE9A&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=28 

 

 

 

 

 

1. ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ

: ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ ์‹œ๊ฐ„ ํšจ์œจ์„ฑ์„ ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒ

: ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ (์ž‘์€ ๋ฌธ์ œ)๋Š” ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ €์žฅ (๋‹ค์‹œ ๊ณ„์‚ฐ X)

: ๋‘ ๊ฐ€์ง€ ํƒ‘๋‹ค์šด(์œ„์—์„œ ์•„๋ž˜, ํ•˜ํ–ฅ์‹ ), ๋ณดํ…€์—…(์•„๋ž˜์—์„œ ์œ„, ์ƒํ–ฅ์‹)์œผ๋กœ ๊ตฌ์„ฑ

: ๋™์  ๊ณ„ํš๋ฒ•

: ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ๋™์  ํ• ๋‹น์€ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋„์ค‘์— ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ธฐ๋ฒ•

=> ๋‹ค์ด๋‚˜๋ฏน์€ ๋ณ„๋‹ค๋ฅธ ์˜๋ฏธ ์—†์ด ์‚ฌ์šฉ

 

1. ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ (Optimal Substructure)

: ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž‘์€ ๋ฌธ์ œ์˜ ๋‹ต์„ ๋ชจ์•„ ํฐ ๋ฌธ์ œ ํ•ด๊ฒฐ

 

2. ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ (Overlapping Subproblem)

: ๋™์ผํ•œ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•ด๊ฒฐ

 

 

 

 

2. ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

: ์ ํ™”์‹์ด๋ž€ ์ธ์ ‘ํ•œ ํ•ญ๋“ค ์‚ฌ์ด์˜ ๊ด€๊ณ„์‹

: ๋ฐฐ์—ด์ด๋‚˜ ๋ฆฌ์ŠคํŠธ ์ด์šฉ

์•ž์— ๋‘์ˆ˜ ๋”ํ•œ ์ˆ˜
ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

 

 

+) ๋‹จ์ˆœ ์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ์ง€์ˆ˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๊ฐ€์ง„๋‹ค

: ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœ, ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„!!

  • python
# ์žฌ๊ท€ ํ•จ์ˆ˜ ๊ตฌํ˜„
def fibo(x) :
    if x == 1 or x == 2 :
        return 1
    return fibo(x-1) + fibo(x-2)
print(fibo(6))
  • c++
#include <bits/stdc++.h>

using namespace std;

// ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜(Fibonacci Function)์„ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„
int fibo(int x) {
    if (x == 1 || x == 2) {
        return 1;
    }
    return fibo(x - 1) + fibo(x - 2);
}

int main(void) {
    cout << fibo(4) << '\n';
}
  • java
import java.util.*;

public class Main {

    // ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜(Fibonacci Function)์„ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„
    public static int fibo(int x) {
        if (x == 1 || x == 2) {
            return 1;
        }
        return fibo(x - 1) + fibo(x - 2);
    }

    public static void main(String[] args) {
        System.out.println(fibo(4));
    }

}

 

 

 

 

3. ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ์‹œ๊ฐ„ ๋ณต์žก๋„

: ์„ธํƒ€ ํ‘œ๊ธฐ๋ฒ• - θ(1.618....^N)

: ๋น…์˜ค ํ‘œ๊ธฐ๋ฒ• - O(2^N)

 

 

 

 

4. ๋ฉ”๋ชจ์ด์ œ์ด์…˜ (Memoization)

: ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• 

: ํ•œ ๋ฒˆ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๋ฉ”๋ชจ

: ๊ฐ™์€ ๋ฌธ์ œ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋ฉด, ๋ฉ”๋ชจํ•œ ๊ฒฐ๊ณผ ๊ฐ€์ ธ์˜ด

: ๊ฐ’ ๊ธฐ๋กํ•˜๊ธฐ = ์บ์‹ฑ (cashing)

: ์ด์ „์— ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ๊ธฐ๋กํ•ด ๋†“๋Š” ๋„“์€ ๊ฐœ๋…

: ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๊ตญํ•œ๋˜์ง€ X

 

 

5.  ํƒ‘๋‹ค์šด vs ๋ณดํ…€์—…

- ํƒ‘๋‹ค์šด (๋ฉ”๋ชจ์ด์ œ์ด์…˜)

: ํ•˜ํ–ฅ์‹

 

- ๋ณดํ…€์—…

: ์ƒํ–ฅ์‹

: ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ „ํ˜•์ ์ธ ํ˜•ํƒœ

: ๊ฒฐ๊ณผ ์ €์žฅ์šฉ ๋ฆฌ์ŠคํŠธ๋Š” DP ํ…Œ์ด๋ธ”

 

 

+) ํƒ‘๋‹ค์šด ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • python
    # ๋ฉ”๋ชจ์ด์ œ์ด์…˜
    d = [0] * 100
    
    
    def fibo(x) :
        if x == 1 or x ==2 :
            return 1
        # ์ด๋ฏธ ๊ณ„์‚ฐ
        if d[x] !=0 :
            return d[x]
        # ์•„์ง ๊ณ„์‚ฐ x
        d[x] = fibo(x - 1) + fibo(x - 2)
        return d[x]
    print(fibo(99))

  • c++
#include <bits/stdc++.h>

using namespace std;

// ํ•œ ๋ฒˆ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
long long d[100];

// ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜(Fibonacci Function)๋ฅผ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ (ํƒ‘๋‹ค์šด ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ)
long long fibo(int x) {
    // ์ข…๋ฃŒ ์กฐ๊ฑด(1 ํ˜น์€ 2์ผ ๋•Œ 1์„ ๋ฐ˜ํ™˜)
    if (x == 1 || x == 2) {
        return 1;
    }
    // ์ด๋ฏธ ๊ณ„์‚ฐํ•œ ์  ์žˆ๋Š” ๋ฌธ์ œ๋ผ๋ฉด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
    if (d[x] != 0) {
        return d[x];
    }
    // ์•„์ง ๊ณ„์‚ฐํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ๋ผ๋ฉด ์ ํ™”์‹์— ๋”ฐ๋ผ์„œ ํ”ผ๋ณด๋‚˜์น˜ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
    d[x] = fibo(x - 1) + fibo(x - 2);
    return d[x];
}

int main(void) {
    cout << fibo(50) << '\n';
}

 

  • java
import java.util.*;

public class Main {

    // ํ•œ ๋ฒˆ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
    public static long[] d = new long[100];

    // ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜(Fibonacci Function)๋ฅผ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ (ํƒ‘๋‹ค์šด ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ)
    public static long fibo(int x) {
        // ์ข…๋ฃŒ ์กฐ๊ฑด(1 ํ˜น์€ 2์ผ ๋•Œ 1์„ ๋ฐ˜ํ™˜)
        if (x == 1 || x == 2) {
            return 1;
        }
        // ์ด๋ฏธ ๊ณ„์‚ฐํ•œ ์  ์žˆ๋Š” ๋ฌธ์ œ๋ผ๋ฉด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
        if (d[x] != 0) {
            return d[x];
        }
        // ์•„์ง ๊ณ„์‚ฐํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ๋ผ๋ฉด ์ ํ™”์‹์— ๋”ฐ๋ผ์„œ ํ”ผ๋ณด๋‚˜์น˜ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
        d[x] = fibo(x - 1) + fibo(x - 2);
        return d[x];
    }

    public static void main(String[] args) {
        System.out.println(fibo(50));
    }
}

 

 

 

 

 

 

 

 

+) ๋ณดํ…€์—… ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • python
d = [0]*100

d[1] = 1
d[2] = 1
n = 99

for i in range(3, n+1) :
    d[i] = d[i-1] + d[i-2]

print(d[n])

  • c++
#include <bits/stdc++.h>

using namespace std;

// ์•ž์„œ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ DP ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™”
long long d[100];

int main(void) {
    // ์ฒซ ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์™€ ๋‘ ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” 1
    d[1] = 1;
    d[2] = 1;
    int n = 50; // 50๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐ

    // ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜(Fibonacci Function) ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„(๋ณดํ…€์—… ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ)
    for (int i = 3; i <= n; i++) {
        d[i] = d[i - 1] + d[i - 2];
    }
    cout << d[n] << '\n';
}
  • java
import java.util.*;

public class Main {

    public static long[] d = new long[100];

    public static void main(String[] args) {
        // ์ฒซ ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์™€ ๋‘ ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” 1
        d[1] = 1;
        d[2] = 1;
        int n = 50; // 50๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐ

        // ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜(Fibonacci Function) ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„(๋ณดํ…€์—… ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ)
        for (int i = 3; i <= n; i++) {
            d[i] = d[i - 1] + d[i - 2];
        }
        System.out.println(d[n]);
    }
}

 

 

 

 

+) ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด : ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋™์ž‘ ๋ถ„์„

: ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ

: ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ด์šฉํ•˜๋ฉด ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)

์ƒ‰์น ๋œ ๋…ธ๋“œ๋งŒ ์ฒ˜๋ฆฌ!

 

  • python
d = [0] * 100

def fibo(x) :
    print("f(" + str(x) + ")", end = " ")
    if x == 1 or x == 2 :
        return 1
    
    if d[x] != 0 :
        return d[x]
    
    d[x] = fibo(x - 1) + fibo(x - 2)
    return d[x]

fibo(6)

 

 

 

 

6. ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ VS ๋ถ„ํ•  ์ •๋ณต

: ๋ชจ๋‘ ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ ๊ฐ€์งˆ ๋•Œ ์‚ฌ์šฉ

( ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„๊ณ , ์ž‘์€ ๋ฌธ์ œ์˜ ๋‹ต์„ ๋ชจ์•„์„œ ํฐ ๋ฌธ์ œ ํ•ด๊ฒฐ)

: ์ฐจ์ด์ ์€ ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ์ค‘๋ณต

( ๋‹ค์ด๋‚˜๋ฏน์€ ๊ฐ ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์ด ์„œ๋กœ ์˜ํ–ฅ ๋ฏธ์น˜๋ฉฐ ๋ถ€๋ถ„ ๋ฌธ์ œ ์ค‘๋ณต)

( ๋ถ„ํ•  ์ •๋ณต์—์„œ๋Š” ๋™์ผํ•œ ๋ถ€๋ถ„ ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต์  ๊ณ„์‚ฐ X)

 

 

EX) ๋ถ„ํ•  ์ •๋ณต ์˜ˆ์‹œ ํ€ต ์ •๋ ฌ

: ๊ธฐ์ค€ ์›์†Œ PIVOT ์ด ์ž๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ์ž๋ฆฌ ์žก์œผ๋ฉด, ๊ทธ ๊ธฐ์ค€ ์›์†Œ์˜ ์œ„์น˜๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์Œ

 

 

 

 

 

7. ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ ‘๊ทผ

: ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์œ ํ˜• ํŒŒ์•…

: ๊ทธ๋ฆฌ๋””, ๊ตฌํ˜„, ์™„์ „ ํƒ์ƒ‰์ธ๊ฐ€

: ์žฌ๊ท€๋กœ ๋น„ํšจ์œจ์ ์ธ ์™„์ „ ํƒ์ƒ‰ ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ -> ํƒ‘๋‹ค์šด ๋ฌธ์ œ ์‚ฌ์šฉ

 

728x90
๋ฐ˜์‘ํ˜•
Comments