๋ฐ์ํ
์ด๋ฒ ๋ฌธ์ ๋ ๋ฐฑํธ๋ํน ๋จ๊ณ์ ์ ๋ฌธ ๋ฌธ์ ์ด๋ค.
๋ฐฑํธ๋ํน ๋ฌธ์ ๋, ํธ๋ฆฌ ํํ์ ๋ ธ๋๋ค์ ๊น์ด ์ฐ์ ํ์ (DFS) ์ ์ํํ๋ฉด์, ๋ ธ๋์ ์ ๋ง์ฑ์ ํ๋จํ์ฌ, ์ ๋งํ์ง ๋ชปํ๋ค๊ณ ์๊ฐํ๋ฉด ๊ฐ์ง์น๊ธฐ๋ฅผ ํ๊ณ (ํ์ด์๊ฐ ๋จ์ถ), ๋ค์ ๋ถ๋ชจ ๋ ธ๋๋ก ๋์๊ฐ์ ๋ค๋ฅธ ์์ ๋ ธ๋๋ฅผ ํ์ํ๋ ๋ฐฉ์์ด๋ค.
๋ฌธ์ ํ์ด
dfs์ ๊ธฐ๋ณธ ํ์ ์๋์ ๊ฐ๋ค.
์ฌ๊ท๋ฅผ ๋๋ผ ์กฐ๊ฑด์ ์ ํด์ค์ผ ํ๋๋ฐ, index๊ฐ M์ด๋ ๊ฐ์ ์์ ์ arr ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
// ์ฌ๊ท๋ฅผ ๋๋ผ ์กฐ๊ฑด
if(index == M) {
for(int i=0; i<M; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
return ;
}
์คํ ์ ๊ณ ๋ คํด์ผ ํ ์ .
- ํด๋น i๊ฐ ์ฌ์ฉ ํ๋์ง์ ๋ํ ์ฌ๋ถ
- ๋ง์ฝ ์ฌ์ฉ ์ํ๋ค๋ฉด, arr[index] = i; ๋ฅผ ๋ฃ์ด์ฃผ๊ณ , isUsed[i] ์ ์ฌ์ฉ์ฌ๋ถ๋ฅผ ์ฒดํฌ ํด ์ค๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋ค์ ์ฌ๊ท ํธ์ถ์ ํด์ค๋ค.
- ์ฌ๊ธฐ์ ์ฃผ์ํด์ผ ํ ์ ์, ์ฌ๊ท ํธ์ถ์ด ๋ค ๋๋๊ณ ๋๋ฉด ๋ค์ isUsed[i]๋ฅผ false๋ก ๋ฐ๊ฟ์ฃผ๋๋ก ํ๋ค.
for(int i=1; i<=N; i++) {
if( !isUsed[i] ) {
arr[index] = i;
isUsed[i] = true;
dfs(index + 1);
isUsed[i] = false;
}
}
์ ์ฒด ์ฝ๋
package Baekjoon;
import java.util.*;
public class BOJ_15694 {
static int N, M;
static int[] arr;
static boolean[] isUsed;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
isUsed = new boolean[N + 1];
arr = new int[M + 1];
recursion(0);
}
private static void recursion(int idx) {
if (idx == M) {
for (int i = 0; i < M; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
return;
}
for (int i = 1; i <= N; i++) {
if (!isUsed[i]) {
isUsed[i] = true;
arr[idx] = i;
recursion(idx + 1); // arr์ ์ธ๋ฑ์ค๋ฅผ +1 ์์ผ์ค๋ค.
isUsed[i] = false;
}
}
}
}
์คํ ๊ณผ์
๋ฐ์ํ