๐Ÿ“ ๋ฐฑ์ค€ 15650๋ฒˆ - N๊ณผ M (2) (DFS/๋ฐฑํŠธ๋ž˜ํ‚น)

์—…๋ฐ์ดํŠธ:
2 ๋ถ„ ์†Œ์š”

๐Ÿ“ ๋ฐฑ์ค€ 15650๋ฒˆ - N๊ณผ M (2) (DFS/๋ฐฑํŠธ๋ž˜ํ‚น)

๋ฐฑ์ค€ ๋กœ๊ณ 


๐Ÿ“Œ 1. ๋ฌธ์ œ ์„ค๋ช…

์ž์—ฐ์ˆ˜ N๊ณผ M์ด ์ฃผ์–ด์กŒ์„ ๋•Œ,
1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์ˆ˜ ์ค‘์—์„œ ์ค‘๋ณต ์—†์ด M๊ฐœ๋ฅผ ๊ณ ๋ฅด๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
๋‹จ, ๊ณ ๋ฅธ ์ˆ˜์—ด์€ ์˜ค๋ฆ„์ฐจ์ˆœ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ฆ‰, ์กฐํ•ฉ(combination) ๊ฐœ๋…์„ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ!
โœ” ์ˆœ์„œ ์ƒ๊ด€ ์—†์Œ (์กฐํ•ฉ)
โœ” ์ค‘๋ณต ํ—ˆ์šฉ ์•ˆ๋จ
โœ” ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ํ•„์ˆ˜

alt


๐Ÿ“Œ 2. ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ์˜ˆ์‹œ

์ž…๋ ฅ ์˜ˆ์‹œ

4 2

์ถœ๋ ฅ ์˜ˆ์‹œ

1 2
1 3
1 4
2 3
2 4
3 4

๐Ÿ“Œ ์ฆ‰, 1๋ถ€ํ„ฐ 4๊นŒ์ง€์˜ ์ˆ˜์—์„œ 2๊ฐœ๋ฅผ ๊ณ ๋ฅด๋Š” ์กฐํ•ฉ์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ!


๐Ÿ“Œ 3. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• (DFS)

์ด ๋ฌธ์ œ๋Š” โ€œ์กฐํ•ฉ(Combination)โ€์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋ฏ€๋กœ DFS(๋ฐฑํŠธ๋ž˜ํ‚น) ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์˜ค๋ฆ„์ฐจ์ˆœ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, dfs()์—์„œ start ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ค‘๋ณต ์—†์ด ์ˆซ์ž๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

โœ… DFS๋ฅผ ํ™œ์šฉํ•œ ํ•ต์‹ฌ ์•„์ด๋””์–ด

  • arr[] ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ M๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์ €์žฅ
  • dfs(start, depth)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ํ˜„์žฌ ์„ ํƒํ•œ ์ˆซ์ž(depth)๋ฅผ ์ฆ๊ฐ€
  • ์ค‘๋ณต ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด start๋ฅผ ๋‹ค์Œ ์ˆซ์ž๋กœ ์„ค์ • (i + 1)

๐Ÿ“Œ 4. ํ•ต์‹ฌ ์ฝ”๋“œ ํ•ด์„ค

๐Ÿ”น DFS ์žฌ๊ท€ํ•จ์ˆ˜

private static void dfs(int start, int depth) {
    // M๊ฐœ๋ฅผ ์„ ํƒํ•œ ๊ฒฝ์šฐ ์ถœ๋ ฅ
    if (depth == M) {
        for (int i : arr)
            System.out.print(i + " ");
        System.out.println();
        return;
    }

    // start๋ถ€ํ„ฐ N๊นŒ์ง€ ์ˆซ์ž ์„ ํƒ (์˜ค๋ฆ„์ฐจ์ˆœ ์œ ์ง€)
    for (int i = start; i <= N; i++) {
        arr[depth] = i;  // ํ˜„์žฌ ์œ„์น˜์— ์ˆซ์ž ์ €์žฅ
        dfs(i + 1, depth + 1);  // ๋‹ค์Œ ์ˆซ์ž๋กœ ์ด๋™
    }
}

โœ… ์„ค๋ช…

  • ๊ธฐ์ € ์กฐ๊ฑด: depth == M์ด๋ฉด ์กฐํ•ฉ์„ ์™„์„ฑํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ์ถœ๋ ฅ
  • for๋ฌธ์„ ํ™œ์šฉํ•ด ์ˆซ์ž ์„ ํƒ (start๋ถ€ํ„ฐ N๊นŒ์ง€)
  • ์ค‘๋ณต ๋ฐฉ์ง€: dfs(i + 1, depth + 1) โ†’ ํ˜„์žฌ ์„ ํƒํ•œ ์ˆซ์ž ์ดํ›„๋ถ€ํ„ฐ ํƒ์ƒ‰

๐Ÿ”น ์ „์ฒด ์ฝ”๋“œ ์ •๋ฆฌ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Back_15650 {

    public static int[] arr;
    public static int N, M;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        arr = new int[M];

        dfs(1, 0);  // 1๋ถ€ํ„ฐ ์‹œ์ž‘, depth๋Š” 0
    }

    private static void dfs(int start, int depth) {
        if (depth == M) {
            for (int i : arr)
                System.out.print(i + " ");
            System.out.println();
            return;
        }

        for (int i = start; i <= N; i++) {
            arr[depth] = i;  // ํ˜„์žฌ ์œ„์น˜์— ์ˆซ์ž ์ €์žฅ
            dfs(i + 1, depth + 1);  // ๋‹ค์Œ ์ˆซ์ž๋กœ ์ด๋™ (์ค‘๋ณต ๋ฐฉ์ง€)
        }
    }
}

๐Ÿ“Œ 5. ํ•ต์‹ฌ ์ •๋ฆฌ

โœ… DFS(๋ฐฑํŠธ๋ž˜ํ‚น)๋กœ โ€œ์กฐํ•ฉ(Combination)โ€์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ
โœ… start ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์˜ค๋ฆ„์ฐจ์ˆœ์„ ์œ ์ง€
โœ… dfs(start, depth)์—์„œ start๋ฅผ ์ฆ๊ฐ€(i + 1)ํ•˜์—ฌ ์ด์ „ ์ˆซ์ž๋ณด๋‹ค ์ž‘์€ ์ˆซ์ž๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •
โœ… ๊ธฐ์ € ์กฐ๊ฑด: depth == M์ด๋ฉด ์กฐํ•ฉ์„ ์™„์„ฑํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ์ถœ๋ ฅ


๐Ÿ“Œ 6. ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

์ด ๋ฌธ์ œ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์กฐํ•ฉ์˜ ๊ฐœ์ˆ˜์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
โœ” N๊ฐœ์˜ ์ˆซ์ž ์ค‘ M๊ฐœ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ โ†’ O( C(N, M) )
โœ” ์กฐํ•ฉ์˜ ๊ณต์‹:
[ C(N, M) = \frac{N!}{M!(N-M)!} ] โœ” ์˜ˆ์‹œ (N=4, M=2) [ C(4, 2) = \frac{4!}{2!(4-2)!} = \frac{4 \times 3}{2 \times 1} = 6 ] โœ” ์ฆ‰, N์ด ํฌ๋”๋ผ๋„ DFS ๋ฐฉ์‹์œผ๋กœ ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด๊ฒŒ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ! ๐Ÿš€


๐Ÿ“Œ 7. ๊ฒฐ๋ก 

๐Ÿ“Œ DFS ๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ™œ์šฉํ•˜์—ฌ โ€œ์ค‘๋ณต ์—†์ด, ์˜ค๋ฆ„์ฐจ์ˆœโ€์œผ๋กœ ์กฐํ•ฉ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ œ
๐Ÿ“Œ start ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์กฐํ•ฉ์˜ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ
๐Ÿ“Œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(C(N, M))์ด๋ฉฐ, N์ด ํฌ์ง€ ์•Š์œผ๋ฏ€๋กœ DFS๋กœ ์ถฉ๋ถ„ํžˆ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ ๐Ÿš€

๐Ÿ’ก ๋ฐฑํŠธ๋ž˜ํ‚น ๋ฌธ์ œ๋ฅผ ์—ฐ์Šตํ•˜๋Š” ๋ฐ ์•„์ฃผ ์ข‹์€ ๋ฌธ์ œ! ๐Ÿ˜Š
๐Ÿ“Œ ์ด์ œ ์ด๊ฑธ ์ดํ•ดํ•˜๋ฉด N๊ณผ M (1) ~ (4) ์‹œ๋ฆฌ์ฆˆ ๋ฌธ์ œ๋„ ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ! ๐Ÿ’ช๐Ÿ”ฅ
๐Ÿ“Œ ์ด์ œ ์ด๊ฑธ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์„œ ๋ธ”๋กœ๊ทธ์— ๋ถ™์—ฌ๋„ฃ์œผ๋ฉด ๋งˆํฌ๋‹ค์šด ํ˜•์‹์œผ๋กœ ์ •๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๐Ÿš€

ํƒœ๊ทธ: , , , , , , , ,

์นดํ…Œ๊ณ ๋ฆฌ: , ,

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ