๐ ๋ฐฑ์ค 15650๋ฒ - N๊ณผ M (2) (DFS/๋ฐฑํธ๋ํน)
๐ ๋ฐฑ์ค 15650๋ฒ - N๊ณผ M (2) (DFS/๋ฐฑํธ๋ํน)
๐ 1. ๋ฌธ์ ์ค๋ช
์์ฐ์ N๊ณผ M์ด ์ฃผ์ด์ก์ ๋,
1๋ถํฐ N๊น์ง์ ์ ์ค์์ ์ค๋ณต ์์ด M๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ๋ฌธ์ ์
๋๋ค.
๋จ, ๊ณ ๋ฅธ ์์ด์ ์ค๋ฆ์ฐจ์์ด์ด์ผ ํฉ๋๋ค.
๐ ์ฆ, ์กฐํฉ(combination) ๊ฐ๋
์ ํ์ฉํด์ผ ํ๋ ๋ฌธ์ !
โ ์์ ์๊ด ์์ (์กฐํฉ)
โ ์ค๋ณต ํ์ฉ ์๋จ
โ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํ์
๐ 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) ์๋ฆฌ์ฆ ๋ฌธ์ ๋ ์ฝ๊ฒ ํ ์ ์์ ๊ฑฐ์ผ! ๐ช๐ฅ
๐ ์ด์ ์ด๊ฑธ ๊ทธ๋๋ก ๋ณต์ฌํด์ ๋ธ๋ก๊ทธ์ ๋ถ์ฌ๋ฃ์ผ๋ฉด ๋งํฌ๋ค์ด ํ์์ผ๋ก ์ ๋ฆฌ๋ฉ๋๋ค. ๐
๋๊ธ๋จ๊ธฐ๊ธฐ