๐Ÿ” ๋ฐฑ์ค€ 15654๋ฒˆ - N๊ณผ M (5)

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

๐Ÿ” ๋ฐฑ์ค€ 15654๋ฒˆ - N๊ณผ M (5) | DFS ์ˆœ์—ด ๋กœ์ง ์™„์ „ ์ •๋ณต

๋ฐฑ์ค€ ๋กœ๊ณ 


๐Ÿ“Œ ๋ฌธ์ œ ์š”์•ฝ

  • ์ž์—ฐ์ˆ˜ N๊ฐœ๊ฐ€ ์ฃผ์–ด์ง€๊ณ , ๊ทธ ์ค‘ M๊ฐœ๋ฅผ ์ค‘๋ณต ์—†์ด ๊ณจ๋ผ ์ˆœ์—ด์„ ๋งŒ๋“ค์–ด์•ผ ํ•จ
  • ์ถœ๋ ฅ์€ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ
  • ์˜ˆ: 1 2, 2 1, 1 3, 3 1, 2 3, โ€ฆ

alt


๐Ÿ“ฅ ์˜ˆ์ œ ์ž…๋ ฅ

3 2
3 1 2

์ •๋ ฌ๋˜๋ฉด: [1, 2, 3]
โ†’ ์ด ์ˆซ์ž๋“ค๋กœ M = 2์ธ ์ˆœ์—ด์„ ๋งŒ๋“ค์–ด์•ผ ํ•จ (์ค‘๋ณต โŒ)


โœ… ํ•ต์‹ฌ ํฌ์ธํŠธ

ํฌ์ธํŠธ ์„ค๋ช…
์ค‘๋ณต ํ—ˆ์šฉ? โŒ ์•ˆ๋จ
์ •๋ ฌ ํ•„์š”? โœ… ์‚ฌ์ „์ˆœ ์ถœ๋ ฅ์„ ์œ„ํ•ด ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
์ž๋ฃŒ๊ตฌ์กฐ visited[] ๋ฐฐ์—ด๋กœ ์ค‘๋ณต ์ฒดํฌ
๋ฐฑํŠธ๋ž˜ํ‚น ์‚ฌ์šฉํ•œ ์ˆซ์ž ๋˜๋Œ๋ฆฌ๊ธฐ

๐Ÿง  DFS ๊ตฌ์กฐ ์ดํ•ดํ•˜๊ธฐ

dfs(depth)
  • depth == M โ†’ ์ถœ๋ ฅ
  • for i in 0 ~ N-1
    • visited[i] == false โ†’ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ์ˆซ์ž ์ €์žฅ ํ›„ dfs(depth + 1)
    • ๋ฐฑํŠธ๋ž˜ํ‚น: visited[i] = false ๋ณต์›

๐Ÿ“š ์‹œ๋ฎฌ๋ ˆ์ด์…˜์œผ๋กœ ์™„์ „ ์ดํ•ดํ•˜๊ธฐ

๐ŸŽฏ ์ดˆ๊ธฐ ์ƒํƒœ

N = 3, M = 2
์ž…๋ ฅ: 3 1 2 โ†’ ์ •๋ ฌ: [1, 2, 3]
dfs(0) ์‹œ์ž‘

โœ… dfs(0)

  • depth = 0
  • visited = [false, false, false]
  • output = []
i = 0 โ†’ 1 ์‚ฌ์šฉ
โ†’ visited[0] = true
โ†’ output[0] = 1
โ†’ dfs(1) ํ˜ธ์ถœ

โœ… dfs(1)

  • depth = 1
  • output = [1, _]
  • visited = [true, false, false]
i = 1 โ†’ 2 ์‚ฌ์šฉ
โ†’ output = [1, 2]
โ†’ visited = [true, true, false]
โ†’ dfs(2)

โœ… ์ถœ๋ ฅ โ†’ 1 2

๐Ÿ”™ ๋ฐฑํŠธ๋ž˜ํ‚น
โ†’ visited[1] = false

i = 2 โ†’ 3 ์‚ฌ์šฉ
โ†’ output = [1, 3]
โ†’ dfs(2)

โœ… ์ถœ๋ ฅ โ†’ 1 3

๐Ÿ”™ visited[2] = false
๐Ÿ”™ visited[0] = false


๐Ÿ” ๋‹ค์Œ ๋ฃจํ”„ ์ง„ํ–‰

i = 1 โ†’ 2 ์‚ฌ์šฉ
โ†’ output = [2, _]
โ†’ visited = [false, true, false]
โ†’ dfs(1)

โ†’ i = 0 โ†’ 1 ์‚ฌ์šฉ โ†’ output = [2, 1]

โœ… ์ถœ๋ ฅ โ†’ 2 1

โ†’ i = 2 โ†’ 3 ์‚ฌ์šฉ โ†’ output = [2, 3]

โœ… ์ถœ๋ ฅ โ†’ 2 3


๐Ÿ” ๋งˆ์ง€๋ง‰ ๋ฃจํ”„

i = 2 โ†’ 3 ์‚ฌ์šฉ
โ†’ output = [3, _]
โ†’ dfs(1)

โ†’ i = 0 โ†’ 1 ์‚ฌ์šฉ โ†’ [3, 1]

โœ… ์ถœ๋ ฅ โ†’ 3 1

โ†’ i = 1 โ†’ 2 ์‚ฌ์šฉ โ†’ [3, 2]

โœ… ์ถœ๋ ฅ โ†’ 3 2


โœ… ์ตœ์ข… ์ถœ๋ ฅ

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

โœ… ์ •๋‹ต ์ฝ”๋“œ

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

public class Back_15654 {
    static int N, M;
    static int[] input, output;
    static boolean[] visited;
    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());
        M = Integer.parseInt(st.nextToken());

        input = new int[N];
        output = new int[M];
        visited = new boolean[N];

        st = new StringTokenizer(br.readLine());
        for(int i = 0; i < N; i++) input[i] = Integer.parseInt(st.nextToken());

        Arrays.sort(input); // ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
        dfs(0);
        System.out.print(sb);
    }

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

        for (int i = 0; i < N; i++) {
            if (!visited[i]) {
                visited[i] = true;
                output[depth] = input[i];
                dfs(depth + 1);
                visited[i] = false;
            }
        }
    }
}

๐Ÿง  ๋งˆ๋ฌด๋ฆฌ ์ •๋ฆฌ

ํ•ญ๋ชฉ ์„ค๋ช…
DFS ๊ธฐ๋ฐ˜ ๋ชจ๋“  ์ˆœ์—ด ์ƒ์„ฑ
visited ์ค‘๋ณต ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ์ฒดํฌ
์˜ค๋ฆ„์ฐจ์ˆœ ์ถœ๋ ฅ Arrays.sort() ์‚ฌ์šฉ
๋ฐฑํŠธ๋ž˜ํ‚น ์‚ฌ์šฉํ•œ ์ˆซ์ž ๋ณต์› ํ›„ ๋‹ค์Œ ๊ฒฝ์šฐ ํƒ์ƒ‰

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

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

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

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