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

[DFS] 5. ๋™์ „๊ตํ™˜

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

<<ํ’€์ด>>

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

์ด ๋ฌธ์ œ๋Š” DFS๋กœ ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ๋™์ „ ์ข…๋ฅ˜์˜ ๊ฐฏ์ˆ˜๋งŒํผ ๊ณ„์†ํ•ด์„œ ๋”ํ•ด์„œ ๊ทธ ๊ฐ’์ด ์ตœ์ข… ํƒ€๊ฒŸ ๊ฐ’์ด ๋˜๋ฉด ๊ทธ ๋•Œ ๊ฐ’์„ ์ตœ์†Ÿ๊ฐ’ ๋น„๊ต๋กœ ๋‹ต์„ ๋„์ถœํ•ด๋‚ธ๋‹ค. ๋งŒ์•ฝ ๊ทธ ๊ฐ’์ด ํƒ€๊ฒŸ ๊ฐ’์„ ๋„˜์–ด์„œ๋ฒ„๋ฆฌ๋ฉด return ํ•˜๊ฒŒ๋” ํ–ˆ๋‹ค.

 

๊ฒฐ๊ตญ ์ •๋‹ต์€ ๋งž์ท„๋‹ค. 

ํ•˜์ง€๋งŒ,  ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋–ด๋‹ค ,, 

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

class Main {
    static int answer;
    int min = Integer.MAX_VALUE;
    private void DFS(int L, int T, int n, int z, int[] arr) {
        if (T > z) return;
        if (T == z) {
            min = Math.min(min, L);
            return;
        } else {
            for (int i = 0; i < n; i++) {
                DFS(L + 1, T + arr[i], n, z, arr);
            }
        }
        answer = min;
    }


    public static void main(String[] args) throws Exception{
        Main T = new Main();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String m = br.readLine();
        int[] arr = new int[n]; // ์—ฌ๊ธฐ์„œ new int[n]์„ ์•ˆ ์จ๋„ ๋ฐ‘ stream์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค.
        arr = Arrays.asList(m.split(" "))
                .stream().mapToInt(Integer::parseInt).toArray();
        int z = Integer.parseInt(br.readLine());

        T.DFS(0, 0, n, z, arr);
        System.out.print(answer);

    }
}

 

๊ทธ๋ž˜์„œ ํŠธ๋ฆฌ๋Š” ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ํ˜•ํƒœ์ด๋ฏ€๋กœ, ๊ฐ€์žฅ ํฐ ๋™์ „์œผ๋กœ ๋จผ์ € ๊ณ„์‚ฐํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์ •๋ ฌ์„ ํ•œ ๋’ค ๊ฐ€์žฅ ํฐ ๊ฐ’๋ถ€ํ„ฐ ๋จผ์ € ๊ณ„์‚ฐ ๋˜๋„๋ก ๊ณ ์ณค๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ๋„ ์‹œ๊ฐ„ ์ดˆ๊ณผ ใ… ใ…  

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;

class Main {
    static int answer;
    int min = Integer.MAX_VALUE;
    private void DFS(int L, int T, int n, int z, int[] arr) {
        if (T > z) return;
        if (T == z) {
            min = Math.min(min, L);
            return;
        } else {
            for (int i = n - 1; i >= 0; i--) {
                DFS(L + 1, T + arr[i], n, z, arr);
            }
        }
        answer = min;
    }


    public static void main(String[] args) throws Exception{
        Main T = new Main();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String m = br.readLine();

        int[] arr = Arrays.asList(m.split(" "))
                .stream().mapToInt(Integer::parseInt).toArray();

        Arrays.sort(arr);

        int z = Integer.parseInt(br.readLine());

        T.DFS(0, 0, n, z, arr);
        System.out.print(answer);

    }
}

 

๋„๋Œ€์ฒด ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผ ํ• ๊นŒ?? ๊ฐ•์‚ฌ๋‹˜์˜ ์ˆ˜์—…์„ ๋“ค์–ด๋ณด์ž,,

 

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

 

ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ ์ •๋ง ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ ์˜€๋‹ค. ์ƒ๊ฐํ•ด๋ณด๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ์ตœ์†Ÿ๊ฐ’๋ณด๋‹ค ๋” ํฐ๊ฐ’์ด๋ผ๋ฉด. ๊ตณ์ด ๋” ๋”ํ•ด์„œ ๋‹ต์„ ๋„์ถœํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์–ด์ฐจํ”ผ ์ตœ์†Ÿ๊ฐ’์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์กฐ๊ฑด์„ ํ•˜๋‚˜ ๋” ๋‹ฌ๋ฉด ๋ฐ”๋กœ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ผ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค ใ…‹ใ…‹

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;

class Main {

    static int answer = Integer.MAX_VALUE;
    private void DFS(int L, int T, int n, int z, Integer[] arr) {
        if (T > z || L > answer) return;
        if (T == z) {
            answer = Math.min(answer, L);
            return;
        } else {
            for (int i = 0; i < n; i++) {
                DFS(L + 1, T + arr[i], n, z, arr);
            }
        }
    }


    public static void main(String[] args) throws Exception{
        Main T = new Main();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String m = br.readLine();

        Integer[] arr = Arrays.asList(m.split(" "))
                .stream().map(Integer::valueOf)
                .toArray(Integer[]::new);

        Arrays.sort(arr, Collections.reverseOrder());

        int z = Integer.parseInt(br.readLine());

        T.DFS(0, 0, n, z, arr);
        System.out.print(answer);

    }
}

 

์ด ๋ฐ‘์˜ ํ’€์ด๋Š” ๊ฐ•์‚ฌ๋‹˜์ด ํžŒํŠธ ์ฃผ์ž ๋งˆ์ž ๋ฐ”๋กœ ์ ์šฉํ•ด์„œ ์ •๋‹ต์„ ๋งž์ถ˜ ์ฝ”๋“œ์ด๋‹ค.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;

class Main {

    static int answer = Integer.MAX_VALUE;
    private void DFS(int L, int T, int n, int z, int[] arr) {
        if (T > z || L > answer) return; // ๋ฐ”๋กœ ์ด๋ถ€๋ถ„ !!
        if (T == z) {
            answer = Math.min(answer, L);
            return;
        } else {
            for (int i = n - 1; i >= 0; i--) {
                DFS(L + 1, T + arr[i], n, z, arr);
            }
        }
    }


    public static void main(String[] args) throws Exception{
        Main T = new Main();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String m = br.readLine();

        int[] arr = Arrays.asList(m.split(" "))
                .stream().mapToInt(Integer::parseInt).toArray();

        Arrays.sort(arr);

        int z = Integer.parseInt(br.readLine());

        T.DFS(0, 0, n, z, arr);
        System.out.print(answer);

    }
}

 

        if (T > z || L > answer) return;

 

๋น„๋ก ์–ด์ด๋Š” ์—†์—ˆ์ง€๋งŒ ์ด ์ž‘์€ ๊ฒƒ ํ•˜๋‚˜๋กœ ์ธํ•ด ๊ณ„์‚ฐ ์†๋„์— ํฐ ์ฐจ์ด๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ตํ›ˆ์„ ์–ป๊ณ  ๊ฐ„๋‹ค.

 

<<์ถ”๊ฐ€ ๊ณต๋ถ€>>

Arrays.sort(arr, Collections.reverseOrder());

 

 ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ์„ ์ง„ํ–‰ํ•  ๋•Œ์—๋Š” Arrays.sort(๋ฐฐ์—ด) ๋กœ ๋ฐ”๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚ด๋ฆผ์ฐจ์ˆœ์ธ ๊ฒฝ์šฐ๋Š” for๋ฌธ์„ ๋Œ๋ฆด๋•Œ ๋ฐ˜๋Œ€๋กœ ํ•ด์ฃผ๊ฑฐ๋‚˜

์œ„์˜ ๋ฐฉ์‹๋Œ€๋กœ Collections์˜ ๋‚ด์žฅ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ arr๋ฐฐ์—ด์˜ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ์ฒด๋กœ ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ int๊ฐ€ ์•„๋‹Œ, wrapper ํด๋ž˜์Šค๋กœ ๋ฐ”๊ฟ”์ค€ Integer ํƒ€์ž…์œผ๋กœ ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค! 

 

๊ทธ๋ž˜์„œ

Integer[] arr = Arrays.asList(m.split(" "))
        .stream().map(Integer::valueOf)
        .toArray(Integer[]::new);

 

์ด๋ ‡๊ฒŒ ๋ณ€ํ˜•์„ ์‹œ์ผœ์ค€๋‹ค.

 

 

๋Œ“๊ธ€