๐๐ปโ๏ธ ๋ฐฑํธ๋ํน์ด๋?
๋ฐฑํธ๋ํน์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ ๋ถ ๊ณ ๋ คํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ผ์ข ์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, DFS, BFS ๋ก ๋ชจ๋ ๊ตฌํ ๊ฐ๋ฅํ๋ค. ๋ฐฑํธ๋ํน์, ๋ต์ด ๋ ์ ์๋ ํ๋ณด๋ ๋์ด์ ํ์ํ์ง ์๊ณ ๋ค์ ๋์๊ฐ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ ๋ คํ๋ ๋ธ๋ฃจํธํฌ์ค๋ณด๋ค ๋ ์๊ฐ์ ์ ์ฝํ ์ ์๋ค.
์์ ํ์์ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์๋ DFS๊ฐ ์๋ค. ์ฌ๊ท๋ฅผ ์ด์ฉํด์ ํ์ฌ์์ ์์ ๊ณ์ํด์ ๋ฐฉ๋ฌธํ ๊ณณ์ ํ์ํ๊ณ , ๋ฐฉ๋ฌธํ๋ค.
๋ฐ๋ฉด, ๋ฐฑํธ๋ํน์ ๋นํจ์จ์ ์ธ ๊ฒฝ๋ก๋ฅผ ์ฐจ๋จํ๊ณ ๋ชฉํ์ง์ ์ ๋๋ฌํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํ๋ ๊ณณ๋ง ํ์ํ๊ธฐ ๋๋ฌธ์ ์ผ์ข ์ ๊ฐ์ง์น๊ธฐ๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
๐๐ปโ๏ธ ๋ฐฑํธ๋ํน ์ ์ฐจ
DFS ์ํ - ์ ๋งํ ๋
ธ๋ ๊ฒํ - ์๋ธํธ๋ฆฌ ์ด๋ - ๋ฐฑํธ๋ํน ์ํ 1. DFS ์ํ : ์ฌ๊ท๋ฅผ ํธ์ถํ๋ฉด์ DFS๋ฅผ ๊ทธ๋๋ก ์ํ 2. ์ ๋งํ ๋ ธ๋ ๊ฒํ : ์ ๋งํ ๋ ธ๋๋ฉด ์๋ธํธ๋ฆฌ๋ก ์ด๋ํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฐฑํธ๋ํน์ ์ํํด์ผํ๋ค. 3. ์๋ธํธ๋ฆฌ ์ด๋ : ๋ฐฉ๋ฌธํ ๋ ธ๋์ ํ์ ๋ ธ๋๋ก ์ด๋ํ์ฌ ๋ค์ ์ฌ๊ท๋ฅผ ํตํด DFS๋ฅผ ์ํ 4. ๋ฐฑํธ๋ํน ์ํ : ๋์ด์ ์ ํจํ ๋ ธ๋๋ผ๊ณ ์๊ฐ๋์ง ์์ผ๋ฉด ์์ ๋ ธ๋๋ก ๋ฐฑํ์ฌ ๋ฐฑํธ๋ํน ์ํ |
๐๐ปโ๏ธ ๋ฐฑํธ๋ํน ๋ํ ์์
์ฌ์ค ๋ํ ์์ ๋ ๋ฐฑ์ค์ N-Queen ๋ฌธ์ ์ด๋ค. ํ์ง๋ง, ๋ ํ์ง ์์๊ธฐ์, ๋ด๊ฐ ํผ ํ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๋ช ํด๋ณด๊ฒ ๋ค.
https://didu-story.tistory.com/269
๋ฌธ์ ๋, ๊ฐ๋จํ๊ฒ ์ค๋ช ํด์, ์ฃผ์ด์ง n ์ด ์๋๋ฐ, n/2 ๊น์ด๊ฐ ๋๋ฉด dfs๋ฅผ ๋ฉ์ถฐ์ผํ๋ ๋ฌธ์ ์๋ค. (๋ด๊ฐ ํด์ํ ๋ฐ๋ก๋ ์ด๋ผ)
func dfs(depth: Int, start: Int) {
// depth ๊ฐ ๋ฐ์ด๋๋ค๋ ๋ป์ ์ด๋ฏธ ํ ํ ๊ตฌ์ฑ์ด ์๋ฃ ๋๋ค๋ ๋ป
// ๊ทธ๋์ depth = n/2 ๊ฐ ๋๋ฉด, ํ๊ตฌ์ฑ๋ชปํ์ ๋ค์(false) team2์ ๋ฃ์ด์ค!!
if depth == n/2 {
team1 = 0
team2 = 0
for i in 0..<n{
for j in 0..<n{
if !visited[i] && !visited[j]{
team2 += s[i][j]
}
if visited[i] && visited[j] {
team1 += s[i][j]
}
}
}
// ๊ทธ๋ฆฌ๊ณ ํ๊ตฌ์ฑ์ด ์๋ฃ๋ ์ ๋ค์ ์ฐจ๋ฅผ ๊ตฌํด์ min๊ฐ์ ๊ณ์ ๊ฐฑ์ ์์ผ์ฃผ์
minResult = min(minResult, abs(team1 - team2))
return
}
for i in start..<n {
if !visited[i] {
visited[i] = true
dfs(depth: depth + 1, start: i)
visited[i] = false
}
}
}
์ด ์ฒ๋ผ, func dfs ์์ ์ด๋ฐ์ if ๋ฌธ์ผ๋ก depth ์ ๊ฐ ๋จผ์ ํ์ธํ๋ค. ๋ง์ฝ if ์ ์กฐ๊ฑด์ด ๋ง์กฑํ๊ฒ ๋๋ค๋ฉด, return ํ๋ฉด์ dfs์ ํ ํด์ ๋๋ด๊ฒ ๋๋ค.
์ด์ฒ๋ผ ๋ฐฑํธ๋ํน์ ๋ฌด์ธ๊ฐ ํน๋ณํ ๊ฐ๋ ์ ์๋๊ณ , DFS/BFS ๋ฅผ ๊ตฌํํ ์ค ์๋ค๋ฉด ์ถฉ๋ถํ ์ต๋ ๊ฐ๋ฅํ ๋ด์ฉ์ธ ๊ฒ ๊ฐ๋ค. (๋ ์ ๋ชปํ์ง๋ง ใ ใ ใ ) ์์ผ๋ก ๋ฐฑํธ๋ํน์ ๋ํ ๊ฐ๋ ์ด ๋์ค๋ ๋ฌธ์ ๋ ๊ผญ ๋ง์ถฐ์ผ์ง!
๐ Reference