๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

[DFS] 2. ๋ฐ”๋‘‘์ด ์Šน์ฐจ

์‹œํ๋ฆฌํ‹ฐ์ง€ํ˜ธ 2024. 2. 16.

<<ํ’€์ด>>

 

 

-๋‚˜์˜ ํ’€์ด- 

 

์•„์ง ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ํƒ“์ธ๊ฐ€ ?? ๋ฌธ์ œ๋Š” ์‰ฌ์›Œ ๋ณด์˜€๊ณ  ์‹ค์ œ๋กœ๋„ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ํ’€์ด๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋งž๋Š”๊ฑฐ ๊ฐ™์ง€๋งŒ ๊ทธ๋Ÿฌํ•˜์ง€ ๋ชปํ•˜๊ณ  ํ‹€๋ ธ๋‹ค ใ… ใ… 

 

์ผ๋‹จ ๋‚˜๋Š” ๊ฐ ์ž๋ฆฌ ์ˆ˜๋ฅผ ๋”ํ•œ๋‹ค ์•„๋‹ˆ๋ฉด ๋” ํ•˜์ง€ ์•Š๋Š”๋‹ค ์ด๋ ‡๊ฒŒ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‘๊ณ  ์ง„ํ–‰ํ–ˆ๋‹ค.

import java.util.ArrayList;
import java.util.Scanner;

class Main {
    static int answer;
    static ArrayList<Integer> list = new ArrayList<>();;


    private void DFS(int L, int maxNum, int[] arr) {


        if (answer > maxNum) {
            answer -= arr[L - 1];
            list.add(answer);
            return;
        } else {
            if(L > arr.length - 1) return;
            answer += arr[L];
            DFS(L + 1, maxNum, arr);
            answer -= arr[L];
            DFS(L + 1, maxNum, arr);
        }
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int maxNum = in.nextInt();
        int total = in.nextInt();
        int[] arr = new int[total];

        for (int i = 0; i < total; i++) {
            arr[i] = in.nextInt();
        }

        T.DFS(0, maxNum, arr);
        int max = 0;
        for (int x : list) {
            if (max <= x) max = x;
        }

        System.out.println(max);

    }
}

 

 

-๊ฐ•์‚ฌ๋‹˜ ํ’€์ด-

 

์•„ ๋งž๋‹ค ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋˜๋Š”๊ตฌ๋‚˜ ~~ ํ•˜๊ณ  ์žˆ๋‹ค ใ…‹ใ…‹

 

<<ํ’€์ด ์ ‘๊ทผ ๋ฐฉ์‹>>

์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ ํ’€์ด๋ฒ•์€ 2^n ์ด๋‹ค. ํ•ฉํ• ๊นŒ ํ•ฉํ•˜์ง€ ์•Š์„๊นŒ ์ด๋ ‡๊ฒŒ 2๊ฐ€์ง€๋กœ ๊ณ„์† ๋‚ด๋ ค์˜จ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฒฐ๊ณผ๊ฐ’์˜ ๊ฐฏ์ˆ˜๋Š” ์›๋ž˜ ์ด 2^n ์ด๋‹ค.

๊ทผ๋ฐ, ๋ฒ”์œ„ ๋‚ด์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ์กฐ๊ฑด์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜์ง€ ์•Š์œผ๋ฉด ๋นผ๋Š” ๊ฒƒ ๋ฟ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋…ผ๋ฆฌ๊ตฌ์กฐ๋กœ ํ‘ผ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

<<๊ตฌ์กฐ์  ์ ‘๊ทผ ๋ฐฉ์‹>>

DFS์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— sum์„ ๋„ฃ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

์ „์ฒด์ ์ธ ๊ตฌ์กฐ๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋กœ์„œ ๋Œ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋‹ค์Œ ์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ ์ง„ํ–‰์ด ๋ ๋•Œ, ์กฐ๊ฑด์œผ๋กœ ์„ฑ๋ฆฝํ•˜๋Š”์ง€ ๋จผ์ € ํŒ ๋ณ„ํ•œ ํ›„์— ๊ทธ ๋‹ค์Œ ์‹์„ ์ง„ํ–‰ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋‚˜๋Š” sum + arr[L] ํ•˜๊ณ  returnํ•ด์„œ ๋Œ์•„์˜ค๋ฉด, ๋ญ”๊ฐ€๊ฐ€ sum์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ๋ฐ”๋€”๊ฑฐ ๊ฐ™์ง€๋งŒ, 

์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๊ณ   Math.max ์•ˆ ์— ๋„ฃ๊ณ  ๊ฑฐ๊ธฐ์— ๋Œ€ํ•œ ๋ฐ˜ํ™˜๊ฐ’์ด answer ์— ๋‹ค์‹œ ๋„ฃ์–ด์ค„ ๋•Œ ๋น„๋กœ์†Œ ๋ฐ˜์˜์ด ๋œ๋‹ค. 

 

*์ฃผ๋กœ DFS๋ฌธ์ œ๋Š” if๊ฐ€ ์žˆ๊ณ  ๊ทธ ๋‹ค์Œ DFS๊ฐ€ ์žˆ๋‹ค.


import java.util.Scanner;

class Main {
    static int answer, c, n;

    private void DFS(int L, int sum, int[] arr) {
        if (sum > c) return; // ํ•„ํ„ฐ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋„ค
        if (L == n)  {
            answer = Math.max(sum, answer);
        } else {
            DFS(L+1, sum + arr[L], arr);
            DFS(L+1, sum , arr);
        }
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        c = in.nextInt();
        n = in.nextInt();
        int[] arr = new int[n];

        for (int i = 0; i < n; i++) {
            arr[i] = in.nextInt();
        }

        T.DFS(0, 0, arr);
        System.out.println(answer);
    }
}

 

์ด๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ๋จธ๋ฆฟ์†์œผ๋กœ ํ•˜๋‹ˆ๊น ์ดํ•ด๋„ ๋ฉด์—์„œ ๊ธด๊ฐ€๋ฏผ๊ฐ€ํ•œ ๊ฑฐ ๊ฐ™๋‹ค ใ…‹ใ…‹

 

์ด ๋ฌธ์ œ๋ฅผ ์ง์ ‘ ๊ทธ๋ ค๋ณด๋ฉด์„œ ๋‹ค์‹œ ๋ด์•ผ๊ฒ ๋‹ค !!

 

 

์ถ”๊ฐ€ ๊ณต๋ถ€๋กœ ์ง์ ‘ ๊ทธ๋ ค๋ณด์•˜๋‹ค. ์—ญ์‹œ ๊ทธ๋ ค๋ณด๋‹ˆ๊นŒ ํ›จ์”ฌ ์ดํ•ด๊ฐ€ ์ž˜ ๋œ๋‹ค. DFS ์™€ BFS๋Š” ๋จธ๋ฆฌ๋กœ๋งŒ ํŒŒ์•…ํ•˜๊ธฐ์— ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.

 

๋”ฐ๋ผ์„œ, ์ด๋ฅผ ์ง์ ‘ ๊ทธ๋ ค๋ณด๊ณ  ํŒ๋‹จํ•˜์ž!!

๋Œ“๊ธ€