๐ ๋ฌธ์
https://www.acmicpc.net/problem/15661
๐ ํ์ด ... ์ ์ด๋ ต์ง ใ ใ
์ด์ ์ ํ์๋ ๋ฌธ์ '14889๋ฒ ์คํํธ์๋งํฌ'๊ณผ ๋์ผํ๋ค. ๋จ, ์กฐ๊ฑด์ด ์กฐ๊ธ ๋ฌ๋ผ์ก๋ค. ์ด์ ๋ฌธ์ ์์๋ ์คํํธํ ์ธ์๊ณผ ๋งํฌํ์ ์ธ์์ด ๋์ผํ์ง๋ง ์ด๋ฒ ๋ฌธ์ ์์๋ ์ธ์์ด 1๋ช ์ด์๋ง ์์ผ๋ฉด ํ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ๋ค. ์ด๋ถ๋ถ์์ ์กฐ๊ธ ํค๋งธ๋๊ฒ ๊ฐ๋ค ใ ใ (๋๋์ฒด ์ฌ๊ท๋ฅผ ์ด์ผ ๋๋ ค์ผํด?)
์ฐ์ ,, ๋ค์ํ๊ฒ ๊ทธ๋ฆผ์ ๊ทธ๋ ค๊ฐ๋ฉด์ ์ฌ๊ท๋ฅผ ์๊ฐํด๋ณด์๋ค. ๊ทธ๋ฆฌ๊ณ , dfs๋ฅผ ๋์ ์กฐ๊ฑด์ ์ด๋ป๊ฒ ๊ตฌ์ฑํ ์ง๋ ์๊ฐ์ด ํ์ํ๋ค. (์์๋ ์ฐจ๊ทผ์ฐจ๊ทผ ์ ๋ฆฌํ๋ฉด์ ์ฌ๊ท๋ฅผ ์๊ฐํ๋๋ซ ์๋๋ผ๊ณ ํ๋จ๋ ์ ๋ค..)
๐๐ป ๋จผ์ ๋ฐฑํธ๋ํน ์กฐ๊ฑด์ ์๊ฐํด๋ณด์
ํ์์ ์ ํํ ์ ๋ ์๊ณ ์์ ํํ ์๋ ์๋ค. ์ด์ ํ์ด์์ ์์ฑํ dfs๋ dfs๋ก ๋๊ฒจ์ง๋ ์ธ์์ visited = true์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋ ๋์ด์๋ค. ์ฌ๊ธฐ๋ถ๋ถ์ ๋ฐ๊ฟ์ผ๋ง ํ๋ค. (ํ์์ ์ ํํ์ง ์๊ณ dfs๋ฅผ ๋๋ ค์ค์ผํ๋ค.)
1๏ธโฃ ์ฒซ๋ฒ์งธ ์กฐ๊ฑด์, depth๊ฐ n๊ณผ ๋์ผํ ๋ผ dfsํจ์๋ฅผ return ํด์ฃผ์ด์ผํ๋ค.
depth๊ฐ n๊ณผ ๋์ผํ๋ค๋ ๊ฒ์, ๋ชจ๋ ์ธ์์ ๋ค ํ์ด๋ดฃ๋ค(?)๋ ์๋ฏธ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ชจ๋ ์ฌ๋์ด visited = true๊ฐ ์๋๊ธฐ ๋๋ฌธ์, depth์ n์ ๋น๊ตํ๋ค.
if depth == n { // ํธ๋ฆฌ์ ๊น์ด๊ฐ n์ด๋ผ๋๊ฒ์, n๋ฒ ๋ค๋ดค๋ค๋ ๋ป
return
}
2๏ธโฃ ๋๋ฒ์งธ ์กฐ๊ฑด์, ํ ์ธ์์ ์ดํด์ค์ผํ๋ค.
ํ ์ธ์์ 1๋ช ~n-1๋ช ๊น์ง๊ตฌ์ฑ์ด ๊ฐ๋ฅํ๋ค. ๊ทธ๋์ ์ง๊ธ visited = true์ธ ํ์์ด ํ๋ช ์ผ ๋, ๋๋ช ์ผ ๋, ์ธ๋ช ์ผ๋,,,, ์ด๋ ๊ฒ ๋ด์ฃผ๋ฉด ๋๋ค! ๋ง๊ทธ๋๋ก ์์ ํ์์ผ ํด์ฃผ๋ ๊ฒ์ด๋ค.
if team == total { ..์ฌ๊ธฐ์ teamStart, teamLink ๊ณ์ฐ.. }
์ ์กฐ๊ฑด๋ค์ ์ ๋ถ func ๋งค๊ฐ๋ณ์๋ก ๋๊ฒจ์ค ๊ฒ์ด๋ค. ๊ทธ๋ ๊ฒ ์ ์ฒด ์์ฑํ ๋์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
private func dfs(depth: Int, team: Int, total: Int) {
if depth == n { // ํธ๋ฆฌ์ ๊น์ด๊ฐ n์ด๋ผ๋๊ฒ์, n๋ฒ ๋ค๋ดค๋ค๋ ๋ป
return
}
if team == total {
var teamStart = 0
var teamLink = 0
for i in 0..<n {
for j in 0..<n {
if visited[i], visited[j] {
teamStart += s[i][j]
}
if !visited[i], !visited[j] {
teamLink += s[i][j]
}
}
}
minResult = min(minResult, abs(teamLink - teamStart))
return
}
visited[depth] = true
dfs(depth: depth + 1, team: team + 1, total: total)
visited[depth] = false
dfs(depth: depth + 1, team: team, total: total)
}
for k in 1..<n {
dfs(depth: 0, team: 0, total: k)
}
print(minResult)
์ด๋ ๊ฒ ํด๋ ๋ฌด์ฌํ ํต๊ณผ๊ฐ ๋๋ค.
๐ ๋ ์ข์ ์ฝ๋
์ธํฐ๋ท์์๋ ๋ค๋ค ๋น์ทํ ๋ฐฉ์์ผ๋ก ํ์๋ค. ๊ทผ๋ฐ, ๋ด๊ฐ ํ๊ฐ์ง ๋์น ๊ฒ์ด ์์๋ค. ์ฐ๋ฆฌ๋ ์ด์จ๋ '๋ ํ์ ์ฐจ์ด'๋ง ๋น๊ตํ๋ฉด ๋๋ค. startํ์ด 3๋ช ์ธ์ง, linkํ์ด 3๋ช ์ธ์ง ์ค์ํ์ง ์๋ค! ๊ทธ๋์, start = 1๊ณผ link = 234๊ฐ ํ์ธ ๊ฒฝ์ฐ๋, start = 234์ link -=1 ์ด ํ์ธ ๊ฒฝ์ฐ๋ฅผ ๋ดค์ ๋, ๋ ๊ฐ์ ๋ต์ ๊ฐ๊ฒ ๋์ฌ ๊ฒ์ด๋ค. ๊ทธ๋์,, total ๋ถ๋ถ์ 0๋ถํฐ n๊น์ง for๋ฌธ์ ๋๋ฆฌ์ง ์๊ณ n/2+1๊น์ง ๋๋ ค์ฃผ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ด๋ค.
์ค์ ๋ก ๋ฒ์๋ฅผ ์์ ํ๊ณ ๋์ผํ ์ฝ๋๋ฅผ ๋๋ฆฌ๋, ์๊ฐ์ด ๋ฐ์ผ๋ก ์ค์๋ค.
for k in 1..<n/2+2 {
// true์ธ ํ์ด 1๊ฐ์ผ๋๋ถํฐ n/2๊ฐ์ผ๋๊น์ง ๋น๊ต
dfs(depth: 0, team: 0, total: k)
}