๋ฌธ์
ํด๋น ํฌ์คํ ์ ๋ฐฑ์ค์ ๋ฌธ์ ์ด๋ฆ ์ ์ ๊ทผ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค๋ช ํ ๊ธ ์ ๋๋ค.
์ ๋ต ์์ค ์ฝ๋๋ฅผ ํ์ธํ์๋ ค๋ฉด solve url ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
15650๋ฒ: N๊ณผ M (2)
ํ ์ค์ ํ๋์ฉ ๋ฌธ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์ด์ ์ถ๋ ฅํ๋ค. ์ค๋ณต๋๋ ์์ด์ ์ฌ๋ฌ ๋ฒ ์ถ๋ ฅํ๋ฉด ์๋๋ฉฐ, ๊ฐ ์์ด์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํด์ ์ถ๋ ฅํด์ผ ํ๋ค. ์์ด์ ์ฌ์ ์์ผ๋ก ์ฆ๊ฐํ๋ ์์๋ก ์ถ๋ ฅํด
www.acmicpc.net
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๊ทผํด์ผ ํ๋์ง๋ฅผ ๋จผ์ ์๊ฐํด๋ณด์.
๋ฌธ์ ์ ๊ทผ
์ด๋ฒ ๋ฌธ์ ๋ ์ง๋ N๊ณผ M (1) ํ์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐฑํธ๋ํน ๋ฌธ์ ์ ๋ํ์ ์ธ ๋ฌธ์ ๋ผ๊ณ ํ ์ ์๋ค.
์ด์ ์๊ฐ๊น์ง ์ฐ๋ฆฌ๋ ๋ธ๋ฃจํธ ํฌ์ค ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ค์ ํ์๋๋ฐ, ๋ธ๋ฃจํธ ํฌ์ค ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋์
ํด ์ ๋ต์ ์ฐพ๋ ๋ฐฉ์์ด๋ค.
ํ์ง๋ง ์ด๋ฒ ๋ฌธ์ ์์ ๋ธ๋ฃจํธ ํฌ์ค ์๊ณ ๋ฆฌ์ฆ์ด ์๋ ๋ฐฑ ํธ๋ํน ์๊ณ ๋ฆฌ์ฆ์ด ๋์ฑ ์ ์ด์ธ๋ ค ๋ณด์ธ๋ค.
Back-Tracking ์๊ณ ๋ฆฌ์ฆ
๋ฐฑํธ๋ํน์ ๋ ธ๋์ ์ ๋ง์ฑ์ ํ๋จํ๋ค.
์ฌ๊ธฐ์ ๋
ธ๋์ ์ ๋ง์ฑ์ด๋ผ๊ณ ํจ์ ์ฝ๊ฒ ๊ฐ์ง์น๊ธฐ๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ ํํ ์๋ก dfs์์ ๋ฐฉ๋ฌธ ํ๋์ง๋ฅผ ํ์ธํ๋ boolean[] check
์ ํด๋นํ๋ค.
์ฌ๊ธฐ์ ๋
ธ๋์ ์ ๋ง์ฑ์ ํ์ธํ๊ณ ๋ง์ฝ ์ ๋งํ์ง ์์ ๋
ธ๋๋ผ๋ฉด ํด๋น ํ์์ ๋ ๊น๊ฒ ๋ค์ด๊ฐ์ง ์๊ณ ๋ค๋ฅธ ํ์์ผ๋ก ์งํํ๊ฒ ๋๋ค.
์ด ๋ฐฉ๋ฒ์ด ๋ฐ๋ก ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค ์๋ํ๋ ๋ธ๋ฃจํธ ํฌ์ค์ ๋ค๋ฅธ์ ์ด๋ผ๊ณ ํ ์ ์๋๋ฐ, ํด๋น ๋ฌธ์ ์์๋ ์ด๋ฌํ ์ ์ ์ด์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
์ง๋ N๊ณผ M (1) ํ์ด์์๋ ์ค๋ณต์ด ์๋ ์๋ฅผ ์ํด์ ์ ๋ง ์กฐ๊ฑด์ check[i] == false
์ธ ๊ฐ๋ง ํ์ํ๋๋ก ํ๋๋ฐ, ์ด๋ฒ ๋ฌธ์ ์์๋ ํ ๊ฐ์ง๋ฅผ ๋ ํด์ผ ํ๋ค.
๊ณ ๋ฅธ ์์ด์ด ์ค๋ฆ์ฐจ์์ด์ด์ผ ํ๋ค.
๋ค์ ๋ ์๋ฅผ ๋ด๋ณด์.
- 1 3 2 4
- 1 2 3 4
์ฌ๊ธฐ์ 1 3 2 4
๋ ์์ด ์์ฒด๊ฐ ์ค๋ฆ ์ฐจ์์ด ์๋๋ฏ๋ก ํ๋ฝํ๊ฒ ๋๋ค.
์ด๊ฑธ ์ด๋ป๊ฒ ๊ตฌํํ ๊น?
ํด๊ฒฐ๋ฒ
์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ์ ๋ง ์กฐ๊ฑด์ ํ๋ ๋ ์ถ๊ฐํ ๊ฒ์ธ๋ฐ, ๋ฐ๋ก ์ง๋๋ฒ ์ฌ์ฉํ ์ธ๋ฑ์ค ๊ฐ์ด ํ์ฌ ๊ฐ๋ณด๋ค ์์ ๊ฒฝ์ฐ ๊ฐ์ง์น๊ธฐ๋ฅผ ํ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์ง๋๋ฒ ์ฌ์ฉํ ์ธ๋ฑ์ค ๊ฐ์ ์๋ ค์ค ๋งค๊ฐ๋ณ์ ํ๋๋ฅผ ์ถ๊ฐํด์ผํ๋ค.
dfs(int index, int n, int m, int before);
before = result[index];
์ ๋ต ์ฝ๋
private static void dfs(int index, int n, int m, int before) {
if(index == m) {
for (int i = 0; i < 8; i++) {
if(result[i] != 0) {
System.out.print(result[i] + " ");
}
}
System.out.println();
return;
}
for (int i = 1; i <= n; i++) {
if(check[i] || i < before) continue; // ์ ๋ง์ฑ ํ๋จ ์กฐ๊ฑด 1, 2
check[i] = true;
result[index] = i;
dfs(index + 1, n, m, result[index]);
check[i] = false;
}
}
๋ด๊ฐ ๊ตฌํํ dfs๋ ์ด๋ ๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ๋ ํจ์จ์ ์ผ๋ก ์ต์ ํ ์ํฌ ์ ์๋ค.
๋ค์ ์ธ๋ฑ์ค๋ฅผ ์ฑ์ฐ๊ธฐ ์ํ for๋ฌธ์ ๋ณด๋ฉด, i๊ฐ 1๋ถํฐ ์์ํด์ ์ ๋ง์ฑ ํ๋จ ์กฐ๊ฑด 1, 2๋ฅผ ๊ฑฐ์น๊ฒ ํ ๊ฒ ์๋๋ผ ์ ์ด์ ์ ๋ง์ฑ ํ๋จ ์กฐ๊ฑด 2๋ฒ์ ๋ง์กฑํ๋ ์๋ง ์ฑ์ฐ๋ฉด ์กฐ๊ฑด ํ๋๋ฅผ ๋ ์ฌ์ฉํ๊ณ ๊ทธ๋งํผ ์๊ฐ๋ ์ต์ ํ๋ ์ ์๋ค.
private static void dfs(int index, int n, int m, int before) {
if(index == m) {
for (int i = 0; i < 8; i++) {
if(result[i] != 0) {
System.out.print(result[i] + " ");
}
}
System.out.println();
return;
}
for (int i = before; i <= n; i++) { // ์์ ์์์ ์ ๋งํ ๋
ธ๋๋ค๋ถํฐ ํด๋ฒ๋ฆฌ๋ฉด ๋จ
if(check[i]) continue; // ์ ๋ง์ฑ ํ๋จ ์กฐ๊ฑด 1
check[i] = true;
result[index] = i;
dfs(index + 1, n, m, result[index]);
check[i] = false;
}
}
๊ทธ๋ผ ์๊ฐ์ ์กฐ๊ธ ๋ ๋จ์ถํ ์ ์๋ค.
๋๊ธ