๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜-๋ฐฑ์ค€(DP)] ๋ฐฑ์ค€ 2748(DP), 10870(Recursive) ํ”ผ๋ณด๋‚˜์น˜์˜ ์ˆ˜ ์ฐจ์ด

by Wonit 2020. 3. 1.

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ(DP, ๋™์  ๊ณ„ํš๋ฒ•, ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ’€์ด) ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ •์˜์™€ ๋ฌธ์ œ ํ’€์ด๋ฅผ ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค

๋™์  ๊ณ„ํš๋ฒ•์— ๋Œ€ํ•œ ๊นŠ์€ ์ดํ•ด์™€ ์ด๋ก ์  ์„ค๋ช…์€ ์ถ”ํ›„์— ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ก  ์—์„œ ๋‹ค๋ฃจ๊ธฐ๋กœ ํ•˜๊ฒ ๋‹ค.

 

๋™์  ๊ณ„ํš๋ฒ•์ด๋ž€?

 

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๋™์  ๊ณ„ํš๋ฒ•์— ํ‘œํ˜„์„ ํ•˜๊ณค ํ•œ๋‹ค.

 

๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์žฌ ํ•ด๊ฒฐ ์ „๋žต์ด๋‹ค.

 

์ด๋Š” ๋ถ„ํ•  ์ •๋ณต๊ณผ ํŠน์ • ๋ฌธ์ œ์˜ ์žฌ๊ท€ ํ˜ธ์ถœ ๋น„์Šทํ•œ ๊ฐœ๋…์ด์ง€๋งŒ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization) ์„ ํ•˜๋Š๋ƒ ์•ˆ ํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ ธ๋‹ค๊ณ  ํ•œ๋‹ค.

Memoization

 

๋ฉ”๋ชจ์ œ์ด์…˜์ด๋ž€, DP์—์„œ ์ž‘์€ ๋ฌธ์ œ๋“ค์ด ํ•ด๊ฒฐ๋  ๋•Œ ํ•ด๋‹น ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜์—ฌ ๋‹ค๋ฅธ ๋ถ€๋ถ„์˜ ๋™์ผํ•œ ๊ณ„์‚ฐ์—, ์ €์žฅ๋œ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.


๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํšจ๊ณผ์ ์œผ๋กœ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ์ด์šฉํ•œ DP๊ฐ€ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ๋ฐ ํ•œ ๋ฒˆ ๋ฐ”๋กœ ํ™•์ธํ•ด๋ณด์ž.

 

๋ฐฑ์ค€ 10870๋ฒˆ : ์žฌ๊ท€ํ˜ธ์ถœ

 

๋ฐฑ์ค€ ๋ฌธ์ œ 10870 ์€ ์žฌ๊ท€ํ˜ธ์ถœ์„ ์ด์šฉํ•ด์„œ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ์™„์„ฑ์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ธ๋ฐ ์•„๋ž˜์˜ ์ž…๋ ฅ์„ ์ž˜ ๋ด๋ณด์ž.

n์ด 20๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜๋กœ ์ œํ•œ๋˜์–ด ์žˆ๋Š”๋ฐ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ 1์ดˆ์ด๋‹ค.

 

package stage.stage09_Recursive;

import java.util.Scanner;

public class Prob02_FibonacciNumvbers {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        int num = input.nextInt();

        System.out.println(fibonacci(num));

    }

    private static int fibonacci(int num){

        if(num >= 2) return fibonacci(num - 1) + fibonacci(num - 2);

        else return num;

    }
}

 

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ์žฌ๊ท€ํ˜ธ์ถœ ํ•œ๋‹ค๋ฉด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” 2^n ์ด ๋  ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ์—์„œ ๋ดค๋“ฏ์ด n์ด 20๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜๋ฅผ ์ด ์‹œ๊ฐ„ ๋ณต์žก๋„์— ์ ์šฉํ•œ๋‹ค๋ฉด

 

 

100๋งŒ์ด ์กฐ๊ธˆ ๋„˜๋Š” ์ˆ˜๋กœ 1์ดˆ์— 1์–ต๋ฒˆ ๊ณ„์‚ฐ์„ ํ•œ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ์ถฉ๋ถ„ํžˆ ํ”ผ๋ณด๋‚˜์น˜๋ฅผ ์žฌ๊ท€ ํ˜ธ์ถœ๋กœ์จ ํ•ด๊ฒฐํ•ด๋„ ๋œ๋‹ค๋Š” ์†Œ๋ฆฌ๋‹ค

 

ํ•˜์ง€๋งŒ n์ด ์ปค์ง„๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

 

์ด๋Ÿฌํ•œ ๋ฌผ์Œ์—์„œ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์‹œ์ž‘ํ•œ๋‹ค.

 

๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์•„๊นŒ ์œ„์—์„œ ๋ง ํ–ˆ๋“ฏ ๋ฉ”๋ชจ์ œ์ด์…˜์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‚ญ๋น„๋ฅผ ์ค„์ธ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์˜ ์žฌ๊ท€ ํ˜ธ์ถœ์ด ์‹ฌ๊ฐํ•œ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‚ญ๋น„๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

private static int fibonacci(int num){
    if(num >= 2) return fibonacci(num - 1) + fibonacci(num - 2);
    else return num;
}

 

๋งŒ์•ฝ n 6์ด๋ฉด

 

 

์ด๋Ÿฐ ์‹์œผ๋กœ ์ค‘๋ณต์ด ๊ณ„์† ๋ˆ„์ ๋˜๊ณ  ๊ฒฐ๊ตญ ํ•„์š”์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‚ญ๋น„๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋ฐฑ์ค€์˜ 2748๋ฒˆ๊ณผ ๊ฐ™์ด n์ด 90๊นŒ์ง€ ํ—ˆ์šฉ๋œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ๋ฐ”๋žŒ์งํ•˜๋‹ค.

 

๋ฐฑ์ค€ 2748๋ฒˆ : ๋™์  ๊ณ„ํš๋ฒ•

 

 

์ด์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ฉ”๋ชจ์ œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ ํ’€์–ด๋ณด์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. (์ฝ”๋“œ๋ฅผ ์œ ์‹ฌํ•˜๊ฒŒ ๋ณด๊ธธ ๋ฐ”๋ž€๋‹ค)

 

package stage.stage09_Recursive;

import java.util.Scanner;

public class Prob03_Fibonacci2 {

    static long[] memo;

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        memo = new long[91]; // ๊ธฐ์–ตํ•  ๊ณต๊ฐ„์ด n ๋งŒํผ์ด๋ฏ€๋กœ n+1์„ ํ• ๋‹น

        int n = input.nextInt();

        System.out.println(fibonacci(n));
    }

    private static long fibonacci(int n){

        if(n <= 1)  return n; //fibonacci(0) ์™€ fibonacci(1)์€ ๊ฐ๊ฐ 0๊ณผ 1์ด ๋ฏ€๋กœ ๋ฐ”๋กœ return

        else { // ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ

            if(memo[n] > 0) return memo[n]; //๋ฉ”๋ชจ์— ๊ฐ’์ด ์ €์žฅ๋œ ๊ฒฝ์šฐ

            else memo[n] = fibonacci(n - 1) + fibonacci(n - 2); // ๊ฐ’์ด ์ €์žฅ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ

            return memo[n];
        }
    }
}

 

์œ„์™€ ๊ฐ™์ด static ํ•„๋“œ๋กœ memo๋ผ๋Š” ๋ฐฐ์—ด์— ๊ฐ’์„ ๋‹ด๊ณ  ํ•œ ๋ฒˆ fibonacci() ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด memo์— ๊ฐ’์„ ๋จผ์ € ๊ฒ€์‚ฌํ•œ ๋’ค memo์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์—†์„ ๋•Œ๋งŒ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์„ ๋ฐ”๋กœ DP์  ํ’€์ด๋ผ๊ณ  ํ•œ๋‹ค.

'๐Ÿ’ป Computer Science > - Data Structure, Algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์•Œ๊ณ ๋ฆฌ์ฆ˜-PS] 1์ดˆ์˜ ์‹œ๊ฐ„๋™์•ˆ CPU๊ฐ€ ์—ฐ์‚ฐํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๊ธฐ.(์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด์— ์‹œ๊ฐ„ ๋ณต์žก๋„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•)  (0) 2020.03.20
[์•Œ๊ณ ๋ฆฌ์ฆ˜-์ด๋ก ]๊ทธ๋ž˜ํ”„์˜ ๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - DFS(Stack)์™€ BFS(Queue)  (2) 2020.03.01
[์•Œ๊ณ ๋ฆฌ์ฆ˜-๋ฐฑ์ค€(์ •๋ ฌ)] ๋ฐฑ์ค€ 11650๋ฒˆ ์ขŒํ‘œ ์ •๋ ฌํ•˜๊ธฐ ์ž๋ฐ” ๋ฌธ์ œํ’€์ด.(Comparable์„ ์ด์šฉํ•œ ๊ฐ์ฒด ๋น„๊ต, 2์ฐจ์› ๋ฐฐ์—ด ์ •๋ ฌ)  (0) 2020.02.24
[์•Œ๊ณ ๋ฆฌ์ฆ˜-๋ฐฑ์ค€(์ •๋ ฌ)] ์ž๋ฐ” 1181๋ฒˆ ๋‹จ์–ด ์ •๋ ฌ ๋ฌธ์ œํ’€์ด. (Comparator์„ ์ด์šฉํ•˜์—ฌ ์ •๋ ฌ ๊ธฐ์ค€ ๋ณ€๊ฒฝ)  (0) 2020.02.24
[์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์Šคํ‚ฌ] ์ž๋ฐ” ์—์„œ Comparator, Comparable ๋กœ ์ •๋ ฌ ๊ธฐ์ค€ ๋ฐ”๊พธ๊ธฐ (๋žŒ๋‹ค๋ฅผ ์ด์šฉํ•ด์„œ ๊น”๋”ํ•˜๊ฒŒ ์žฌ์ •์˜ํ•˜๊ธฐ)  (1) 2020.02.24

๋Œ“๊ธ€