๊ฒ๋ฆฌ๋งจ๋๋ง(๋ฌธ์ _ 17471)
๋ฐฑ์ค์์ ์์ฅ ์ต๋ฐฑ์ค์ ์ง๋ ๋ช ๋ ๊ฐ ๊ฒ๋ฆฌ๋งจ๋๋ง์ ํตํด์ ์์ ์ ๋น์๊ฒ ์ ๋ฆฌํ๊ฒ ์ ๊ฑฐ๊ตฌ๋ฅผ ํ์ ํ๋ค. ๊ฒฌ์ ํ ๊ถ๋ ฅ์ด ์์ด์ง ์ต๋ฐฑ์ค์ ๊ถ๋ ฅ์ ๋งค์ฐ ๋ถ๋นํ๊ฒ ํ์ฌํ๊ณ , ์ฌ์ง์ด๋ ์์ ์ด๋ฆ๋ ๋ฐฑ์ค์๋ก ๋ณ๊ฒฝํ๋ค. ์ด๋ฒ ์ ๊ฑฐ์์๋ ์ต๋ํ ๊ณตํํ๊ฒ ์ ๊ฑฐ๊ตฌ๋ฅผ ํ์ ํ๋ ค๊ณ ํ๋ค.
๋ฐฑ์ค์๋ N๊ฐ์ ๊ตฌ์ญ์ผ๋ก ๋๋์ด์ ธ ์๊ณ , ๊ตฌ์ญ์ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ค. ๊ตฌ์ญ์ ๋ ๊ฐ์ ์ ๊ฑฐ๊ตฌ๋ก ๋๋ ์ผ ํ๊ณ , ๊ฐ ๊ตฌ์ญ์ ๋ ์ ๊ฑฐ๊ตฌ ์ค ํ๋์ ํฌํจ๋์ด์ผ ํ๋ค. ์ ๊ฑฐ๊ตฌ๋ ๊ตฌ์ญ์ ์ ์ด๋ ํ๋ ํฌํจํด์ผ ํ๊ณ , ํ ์ ๊ฑฐ๊ตฌ์ ํฌํจ๋์ด ์๋ ๊ตฌ์ญ์ ๋ชจ๋ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํ๋ค. ๊ตฌ์ญ A์์ ์ธ์ ํ ๊ตฌ์ญ์ ํตํด์ ๊ตฌ์ญ B๋ก ๊ฐ ์ ์์ ๋, ๋ ๊ตฌ์ญ์ ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ํ๋ค. ์ค๊ฐ์ ํตํ๋ ์ธ์ ํ ๊ตฌ์ญ์ 0๊ฐ ์ด์์ด์ด์ผ ํ๊ณ , ๋ชจ๋ ๊ฐ์ ์ ๊ฑฐ๊ตฌ์ ํฌํจ๋ ๊ตฌ์ญ์ด์ด์ผ ํ๋ค.
๊ณตํํ๊ฒ ์ ๊ฑฐ๊ตฌ๋ฅผ ๋๋๊ธฐ ์ํด ๋ ์ ๊ฑฐ๊ตฌ์ ํฌํจ๋ ์ธ๊ตฌ์ ์ฐจ์ด๋ฅผ ์ต์๋ก ํ๋ ค๊ณ ํ๋ค. ๋ฐฑ์ค์์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, ์ธ๊ตฌ ์ฐจ์ด์ ์ต์๊ฐ์ ๊ตฌํด๋ณด์.
์
๋ ฅ
์ฒซ์งธ ์ค์ ๊ตฌ์ญ์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์ ๊ตฌ์ญ์ ์ธ๊ตฌ๊ฐ 1๋ฒ ๊ตฌ์ญ๋ถํฐ N๋ฒ ๊ตฌ์ญ๊น์ง ์์๋๋ก ์ฃผ์ด์ง๋ค. ์ธ๊ตฌ๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด์ ธ ์๋ค.
์ ์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฐ ๊ตฌ์ญ๊ณผ ์ธ์ ํ ๊ตฌ์ญ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ์ ๋ณด์ ์ฒซ ๋ฒ์งธ ์ ์๋ ๊ทธ ๊ตฌ์ญ๊ณผ ์ธ์ ํ ๊ตฌ์ญ์ ์์ด๊ณ , ์ดํ ์ธ์ ํ ๊ตฌ์ญ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ๋ชจ๋ ๊ฐ์ ์ ์๋ก ๊ตฌ๋ถ๋์ด์ ธ ์๋ค.
๊ตฌ์ญ A๊ฐ ๊ตฌ์ญ B์ ์ธ์ ํ๋ฉด ๊ตฌ์ญ B๋ ๊ตฌ์ญ A์ ์ธ์ ํ๋ค. ์ธ์ ํ ๊ตฌ์ญ์ด ์์ ์๋ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ฐฑ์ค์๋ฅผ ๋ ์ ๊ฑฐ๊ตฌ๋ก ๋๋์์ ๋, ๋ ์ ๊ฑฐ๊ตฌ์ ์ธ๊ตฌ ์ฐจ์ด์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค. ๋ ์ ๊ฑฐ๊ตฌ๋ก ๋๋ ์ ์๋ ๊ฒฝ์ฐ์๋ -1์ ์ถ๋ ฅํ๋ค.
์์
6
5 2 3 4 1 2
2 2 4
4 1 3 6 5
2 4 2
2 1 3
1 2
1 2
answer : 1
ํ์ด
n๊ฐ์ ๊ตฌ์ญ์ ๋๊ฐ์ ์ ๊ฑฐ๊ตฌ๋ก ๋๋๊ธฐ ์ํด์ 1 ์ ๊ฑฐ๊ตฌ์ 2 ์ ๊ฑฐ๊ตฌ์ ๋ฝ์ ๊ตฌ์ญ์ ์๋ฅผ ์ ํ๋ค.
๋ง์ฝ n์ด 5์ผ๋, ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ญ์ ์๋ฅผ ๋๋ ์ ์๋ค.
1์ ๊ฑฐ๊ตฌ ๊ตฌ์ญ์ ์ | 2์ ๊ฑฐ๊ตฌ ๊ตฌ์ญ์ ์ |
---|---|
1 | 4 |
2 | 3 |
3 | 2 |
4 | 1 |
์ฆ for๋ฌธ์ ๋์๊ฐ๋ฉฐ n๊ฐ์ค 1,2,3,4๊ฐ๋ฅผ ๋ฝ์ 1์ ๊ฑฐ๊ตฌ์ ๋ฃ๋๋ค๋ฉด ์์ฐ์ค๋ฝ๊ฒ 1์ ๊ฑฐ๊ตฌ์ 2์ ๊ฑฐ๊ตฌ๋ ๋๋๊ฒ๋๋ค.
์ด๋ ๊ฐ ์ ๊ฑฐ๊ตฌ์ ๊ตฌ์ญ์ ์๋ฅผ 2,3์ผ๋ก ๋๋๋ ๊ฒ๊ณผ 3,2๋ก ๋๋๋ ๊ฒ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ธ๋ค๋ ์ฌ์ค์ ์์์ฑ ์ ์๋ค. (1,4์ 4,1๋ ๋ง์ฐฌ๊ฐ์ง)
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ n๊ฐ ์ค 1~n/2๊ฐ๋ฅผ ๋ฝ์ 1์ ๊ฑฐ๊ตฌ์ ๋ฃ์ผ๋ฉด ์ค๋ณต์ผ๋ก ์ฝ๋๊ฐ ์คํ๋๋ ๊ฒ์ ๋ง์ ์ ์๋ค.
์ด๋ ๊ฒ 1์ ๊ฑฐ๊ตฌ ๊ตฌ์ญ์ ๋ฝ๋๋ค๋ฉด, ๋ฝํ์ง ์์ ๊ตฌ์ญ๋ค์ ์์ฐ์ค๋ฝ๊ฒ 2์ ๊ฑฐ๊ตฌ๋ก ๋ค์ด๊ฐ๋ค.
๋ง์ง๋ง์ผ๋ก ๋ฝ์ ๊ฐ ์ ๊ฑฐ๊ตฌ๊ฐ ์๋ก ์ฐ๊ฒฐ๋์ด ์๋์ง ํ๋จํ๊ณ , ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด ์ธ๊ตฌ์์ ์ฐจ์ด๋ฅผ ๊ตฌํ๋ฉด ๋๋ค.
๊ตฌ์ญ๊ตฌ๊ฐ ์ฐ๊ฒฐ ๋์๋์ง ํ๋จ -> dfs()
์ฝ๋
// main ํจ์ ์ผ๋ถ์ฝ๋
for (int i = 1; i <= n / 2; i++) {
selected = new boolean[n + 1];
func(0, 1, i); // ํ์ฌ ๋ฝ์ ์ (0), ์์ ์ธ๋ฑ์ค(1), ๋ฝ์์ผ ํ๋ ๊ฐ์(i)
}
if (min == Integer.MAX_VALUE) // ๋ ์ ๊ฑฐ๊ตฌ๋ก ๋๋ ์ ์๋ ๊ฒฝ์ฐ
System.out.println("-1");
else
System.out.println(min); // ์ธ๊ตฌ ์ต์๊ฐ ์ถ๋ ฅ
private static void func(int cur, int idx, int m) {
if (cur == m) {
if (check()) { // ๋ง์ฝ ๋ ํ ๋ค ์ฐ๊ฒฐ๋์๋ค๋ฉด
min = Math.min(cal(), min); // ์ต์๊ฐ ๊ฐฑ์
}
return;
}
for (int i = 1; i <= n; i++) {
if (selected[i]) // ์ด๋ฏธ ๋ฝ์ ๊ฒฝ์ฐ๋ผ๋ฉด
continue;
selected[i] = true; // ์ ํ
func(cur + 1, i + 1, m); // ๋ค์ ๊ตฌ์ญ ์ ํํ๋ฌ ์ถ๋ฐ
selected[i] = false; // ์ ํ ์ทจ์
}
}
private static int cal() { .. ์๋ต .. } // ๋ ์ ๊ฑฐ๊ตฌ ๊ฐ ์ธ๊ตฌ์ ์ฐจ์ด ๊ตฌํ๊ธฐ
private static void dfs(int i, int type, boolean chk) { .. ์๋ต .. } // ๊ทธ๋ํ ํ์
private static boolean check() { // dfsํจ์๋ฅผ ํตํด ์ ๊ฑฐ๊ตฌ๊ฐ ์ฐ๊ฒฐ๋์๋์ง ํ๋จ
for (int i = 1; i <= n; i++) {
visited1[i] = false;
visited2[i] = false;
} // ์ด๊ธฐํ
boolean flag1 = false, flag2 = false;
for (int i = 1; i <= n; i++) {
if (selected[i]) {
if (!visited1[i]) {
if (!flag1) { // ์ฒ์์ด๋ผ๋ฉด
dfs(i, 1, true); // ํ๋ฒ์ dfs๋ก ๋ฝํ ์ ๊ฑฐ๊ตฌ ๋ชจ๋ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋จ
flag1 = true;
} else
return false; // ์ฐ๊ฒฐ๋์ด ์์ง ์๋ค๋ฉด (1 ์ ๊ฑฐ๊ตฌ)
}
} else {
if (!visited2[i]) {
if (!flag2) {// ์ฒ์์ด๋ผ๋ฉด
dfs(i, 2, false); // ํ๋ฒ์ dfs๋ก ๋ฝํ ์ ๊ฑฐ๊ตฌ ๋ชจ๋ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋จ
flag2 = true;
} else
return false; // ์ฐ๊ฒฐ๋์ด ์์ง ์๋ค๋ฉด (2 ์ ๊ฑฐ๊ตฌ)
}
}
}
return true; // ์ ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒฝ์ฐ
}