๐Ÿ” ๋ฐฑ์ค€ 15651๋ฒˆ - N๊ณผ M (3) (DFS/๋ฐฑํŠธ๋ž˜ํ‚น)

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

๐Ÿ” ๋ฐฑ์ค€ 15651๋ฒˆ - N๊ณผ M (3) (DFS/๋ฐฑํŠธ๋ž˜ํ‚น)

๋ฐฑ์ค€ ๋กœ๊ณ 


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

  • 1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์ž์—ฐ์ˆ˜ ์ค‘์—์„œ M๊ฐœ๋ฅผ ์ค‘๋ณตํ•˜์—ฌ ๊ณ ๋ฅด๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์—ด(Permutation)๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ํ’€์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ถœ๋ ฅ์€ ์‚ฌ์ „์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

alt

โœ… ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ•œ ์ˆœ์—ด (์ค‘๋ณต ์ˆœ์—ด)

โœ” 1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์ˆ˜๋ฅผ ์ค‘๋ณต ํ—ˆ์šฉํ•˜์—ฌ M๊ฐœ๋ฅผ ๋ฝ‘์•„ ๋‚˜์—ด
โœ” ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•จ โ†’ ์ค‘๋ณต ์ˆœ์—ด(Permutation with Repetition)
โœ” DFS(๋ฐฑํŠธ๋ž˜ํ‚น)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ ํƒ์ƒ‰


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

๐Ÿ”น ์ž…๋ ฅ ์˜ˆ์‹œ

3 2

๐Ÿ”น ์ถœ๋ ฅ ์˜ˆ์‹œ

1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3

โœ… ์ฆ‰, 1~3๊นŒ์ง€์˜ ์ˆ˜๋ฅผ ์ค‘๋ณต ํฌํ•จํ•˜์—ฌ 2๊ฐœ๋ฅผ ๋ฝ‘๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ถœ๋ ฅ


๐Ÿ“Œ 3. DFS(๋ฐฑํŠธ๋ž˜ํ‚น) ๊ฐœ๋…

DFS(๋ฐฑํŠธ๋ž˜ํ‚น) ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

  • M๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ์ฑ„์šธ ๋•Œ๊นŒ์ง€ ์žฌ๊ท€ ํ˜ธ์ถœ ์ง„ํ–‰
  • ๊ฐ ์ž๋ฆฌ์—์„œ 1๋ถ€ํ„ฐ N๊นŒ์ง€ ๋ชจ๋“  ์ˆซ์ž๋ฅผ ์„ ํƒ ๊ฐ€๋Šฅ (์ค‘๋ณต ํ—ˆ์šฉ)
  • StringBuilder๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ถœ๋ ฅ ์ตœ์ ํ™” (์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ฐฉ์ง€)

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

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

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

public class Back_15651 {

    static int arr[];
    static int N;
    static int M;
    static StringBuilder sb = new StringBuilder(); // ์ตœ์ ํ™”๋œ ์ถœ๋ ฅ ์ฒ˜๋ฆฌ

    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()); // 1~N๊นŒ์ง€์˜ ์ž์—ฐ์ˆ˜
        M = Integer.parseInt(st.nextToken()); // ๋ฝ‘์•„์•ผ ํ•  ๊ฐœ์ˆ˜

        arr = new int[M]; // ์„ ํƒ๋œ ์ˆซ์ž๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด
        dfs(0); // DFS ํƒ์ƒ‰ ์‹œ์ž‘
        System.out.println(sb); // ๊ฒฐ๊ณผ ํ•œ ๋ฒˆ์— ์ถœ๋ ฅ
    }

    public static void dfs(int depth) {
        if (depth == M) { // M๊ฐœ๋ฅผ ๋ชจ๋‘ ์„ ํƒํ•œ ๊ฒฝ์šฐ
            for (int i = 0; i < M; i++) {
                sb.append(arr[i]).append(" ");
            }
            sb.append('\n'); // ์ค„ ๋ฐ”๊ฟˆ ์ถ”๊ฐ€
            return;
        }

        for (int i = 1; i <= N; i++) { // 1๋ถ€ํ„ฐ N๊นŒ์ง€ ๋ชจ๋“  ์ˆซ์ž ์„ ํƒ ๊ฐ€๋Šฅ (์ค‘๋ณต O)
            arr[depth] = i; // ํ˜„์žฌ ์œ„์น˜(depth)์— ์ˆซ์ž ์ €์žฅ
            dfs(depth + 1); // ๋‹ค์Œ ์ˆซ์ž ์„ ํƒ์„ ์œ„ํ•ด ์žฌ๊ท€ ํ˜ธ์ถœ
        }
    }
}

๐Ÿ“Œ 5. dfs() ํ•จ์ˆ˜ ์ƒ์„ธ ๋ถ„์„

๐Ÿ”น 1๏ธโƒฃ ๊ธฐ์ € ์กฐ๊ฑด (์ข…๋ฃŒ ์กฐ๊ฑด)

if (depth == M) {
    for (int i = 0; i < M; i++) {
        sb.append(arr[i]).append(" ");
    }
    sb.append('\n');
    return;
}

โœ… ์„ค๋ช…

  • depth == M์ด๋ฉด M๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋‹ค ๋ฝ‘์•˜์œผ๋ฏ€๋กœ ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
  • arr ๋ฐฐ์—ด์— ์ €์žฅ๋œ ์ˆซ์ž๋“ค์„ sb.append()๋กœ ์ €์žฅ ํ›„ ์ค„ ๋ฐ”๊ฟˆ ์ถ”๊ฐ€
  • ์žฌ๊ท€ ์ข…๋ฃŒ ํ›„ ์ด์ „ ๋‹จ๊ณ„๋กœ ๋˜๋Œ์•„๊ฐ (๋ฐฑํŠธ๋ž˜ํ‚น)

๐Ÿ”น 2๏ธโƒฃ DFS ํƒ์ƒ‰ (์žฌ๊ท€ ํ˜ธ์ถœ)

for (int i = 1; i <= N; i++) { // 1๋ถ€ํ„ฐ N๊นŒ์ง€ ์„ ํƒ ๊ฐ€๋Šฅ (์ค‘๋ณต ํ—ˆ์šฉ)
    arr[depth] = i;  // ํ˜„์žฌ ์œ„์น˜(depth)์— ์ˆซ์ž ์ €์žฅ
    dfs(depth + 1);  // ๋‹ค์Œ ์ˆซ์ž ์„ ํƒ์„ ์œ„ํ•ด ์žฌ๊ท€ ํ˜ธ์ถœ
}

โœ… ์„ค๋ช…

  • 1๋ถ€ํ„ฐ N๊นŒ์ง€ ๋ชจ๋“  ์ˆซ์ž๋ฅผ ์ค‘๋ณต ํ—ˆ์šฉํ•˜์—ฌ ์„ ํƒ
  • arr[depth] = i โ†’ ํ˜„์žฌ ์„ ํƒํ•œ ์ˆซ์ž๋ฅผ arr[]์— ์ €์žฅ
  • dfs(depth + 1) โ†’ ๋‹ค์Œ ์ˆซ์ž๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ์žฌ๊ท€ ํ˜ธ์ถœ

๐Ÿ“Œ 6. DFS ์‹คํ–‰ ๊ณผ์ •

โœ… DFS ํŠธ๋ฆฌ ํ˜•ํƒœ

dfs(0) โ”€โ”€โ”€โ”€โ”€โ†’ 1 ์„ ํƒ โ†’ dfs(1) โ”€โ”€โ”€โ”€โ”€โ†’ 1 ์„ ํƒ โ†’ dfs(2) โ†’ "1 1" ์ถœ๋ ฅ ํ›„ ๋ฐฑํŠธ๋ž˜ํ‚น
                        โ”‚
                        โ”œโ”€โ”€โ†’ 2 ์„ ํƒ โ†’ dfs(2) โ†’ "1 2" ์ถœ๋ ฅ ํ›„ ๋ฐฑํŠธ๋ž˜ํ‚น
                        โ”‚
                        โ”œโ”€โ”€โ†’ 3 ์„ ํƒ โ†’ dfs(2) โ†’ "1 3" ์ถœ๋ ฅ ํ›„ ๋ฐฑํŠธ๋ž˜ํ‚น
                        โ”‚
dfs(0) โ”€โ”€โ”€โ”€โ”€โ†’ 2 ์„ ํƒ โ†’ dfs(1) โ”€โ”€โ”€โ”€โ”€โ†’ 1 ์„ ํƒ โ†’ dfs(2) โ†’ "2 1" ์ถœ๋ ฅ ํ›„ ๋ฐฑํŠธ๋ž˜ํ‚น
                        โ”‚
                        โ”œโ”€โ”€โ†’ 2 ์„ ํƒ โ†’ dfs(2) โ†’ "2 2" ์ถœ๋ ฅ ํ›„ ๋ฐฑํŠธ๋ž˜ํ‚น
                        โ”‚
                        โ”œโ”€โ”€โ†’ 3 ์„ ํƒ โ†’ dfs(2) โ†’ "2 3" ์ถœ๋ ฅ ํ›„ ๋ฐฑํŠธ๋ž˜ํ‚น
                        โ”‚
dfs(0) โ”€โ”€โ”€โ”€โ”€โ†’ 3 ์„ ํƒ โ†’ dfs(1) โ”€โ”€โ”€โ”€โ”€โ†’ 1 ์„ ํƒ โ†’ dfs(2) โ†’ "3 1" ์ถœ๋ ฅ ํ›„ ๋ฐฑํŠธ๋ž˜ํ‚น
                        โ”‚
                        โ”œโ”€โ”€โ†’ 2 ์„ ํƒ โ†’ dfs(2) โ†’ "3 2" ์ถœ๋ ฅ ํ›„ ๋ฐฑํŠธ๋ž˜ํ‚น
                        โ”‚
                        โ”œโ”€โ”€โ†’ 3 ์„ ํƒ โ†’ dfs(2) โ†’ "3 3" ์ถœ๋ ฅ ํ›„ ๋ฐฑํŠธ๋ž˜ํ‚น

โœ… ์„ค๋ช…

  1. dfs(0)์—์„œ 1 ์„ ํƒ โ†’ dfs(1) ํ˜ธ์ถœ
  2. dfs(1)์—์„œ 1 ์„ ํƒ โ†’ dfs(2) ํ˜ธ์ถœ โ†’ โ€œ1 1โ€ ์ถœ๋ ฅ ํ›„ return
  3. dfs(1)์—์„œ 2 ์„ ํƒ โ†’ dfs(2) ํ˜ธ์ถœ โ†’ โ€œ1 2โ€ ์ถœ๋ ฅ ํ›„ return
  4. โ€ฆ ๋ฐ˜๋ณตํ•˜์—ฌ ๋ชจ๋“  ๊ฒฝ์šฐ ํƒ์ƒ‰

๐Ÿ“Œ 7. ๊ฒฐ๋ก 

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

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

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

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

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

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