
๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/14889
14889๋ฒ: ์คํํธ์ ๋งํฌ
์์ 2์ ๊ฒฝ์ฐ์ (1, 3, 6), (2, 4, 5)๋ก ํ์ ๋๋๋ฉด ๋๊ณ , ์์ 3์ ๊ฒฝ์ฐ์๋ (1, 2, 4, 5), (3, 6, 7, 8)๋ก ํ์ ๋๋๋ฉด ๋๋ค.
www.acmicpc.net


๋ฌธ์ ํ์ด
ํด๋น ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด์๋ ์์ ํ์์ผ๋ก ํ๊ฑฐ๋, ๋ฐฑํธ๋ํน์ด๋ผ๋ ๊ฐ๋ ์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ํ๋ค. ์์ ํ์์ ๋ง๊ทธ๋๋ก ๊ทธ๋ํ ์ ์ฒด๋ฅผ ํ์ํด์ ํ์์ด ๋๋์ง, ์๋๋์ง ํ๋จํ๋ ๋ฐฉ๋ฒ์ด๊ณ , ๋ฐฑํธ๋ํน์ "DFS ๋ฐฉ๋ฒ์ด์ง๋ง, ์ด๋์ ๋์ depth์ ๋๋ฌํ๊ฒ ๋๋ฉด ํ์์ค์ง"ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋ฐฑํธ๋ํน์ ๋ํ ๊ฐ๋ ์ ์ ๋ชจ๋ฅด๋, ์ด ๋ฌธ์ ๋ฅผ ํฌ์คํ ํ ํ ๋ฐฑํธ๋ํน๊ณผ ๊ด๋ จํ ์๊ณ ๋ฆฌ์ฆ ํฌ์คํ ์ ํ ์์ ์ด๋ค.
์ฐ์ ๋๋, ๋ฐฑํธ๋ํน์ด ๋ญ์ง ๋ชจ๋ฅด๊ฒ ๊ณ !! dfs๋ฅผ ๊ตฌํํ์ง๋ง, ์ผ์ ์ซ์๊ฐ ๋๋ค๋ฉด, ํ์ ๊ตฌ์ฑ์ ๋ฉ์ถ๊ณ ์ฐจ์ด๋ฅผ ๊ตฌํ๋ค. (์ด๊ฒ๋ฐ๋ก ๋ฐฑํธ๋ํน!!)
1. ํ๊ตฌ์ฑ์ ์ํ ๋ณ์ ์ค์
- n : ์ ๋ ฅ๋ฐ๋ ๋ณ์
- s : ์ ๋ ฅ๋ฐ๋ ๋ฅ๋ ฅ์น
- visited : ๋ฐฉ๋ฌธ์ฒ๋ฆฌ (ํ ๊ตฌ์ฑ์ด ์๋ฃ๋ ๊ฒ์ true, ์๋๊ฒ์ false๋ก ๋ ์์ )
- team1 : team1์ด ๋ ์ฌ๋๋ค์ ๋ฅ๋ ฅ์น ํฉ
- team2 : team2๊ฐ ๋ ์ฌ๋๋ค์ ๋ฅ๋ ฅ์น ํฉ
- minResult : ์์ ๊ฐ์ ๊ณ์ํด์ ๊ฐฑ์ ํ ์์ , (์ด๋ฐ์ ํฐ์ ์์๋ก ์ค์ )
let n = Int(String(readLine()!))!
var s = Array(repeating: Array(repeating: 0, count: n), count: n)
var visited = Array(repeating: false, count: n)
var team1 = 0
var team2 = 0
var minResult = 99999
2. dfs ํจ์
- i๋ถํฐ ํ์ํ๋ฉด์ visited ์ true ๋ก ๋ฐ๊พธ๋ฉด์ ํ์
for i in start..<n {
if !visited[i] {
visited[i] = true
dfs(depth: depth + 1, start: i)
visited[i] = false
}
}
- depth ๊ฐ n/2 ๊ฐ ๋๋ ์๊ฐ, dfs์ ํ์์ ์ค์งํ ๊ฒ์ด๋ค. ๊ทธ๋์ if ๋ฌธ์ dfs ํจ์ ๋ด๋ถ ์ต์๋จ์ ์์น์ํด
- ๊ณ์ํด์ ๊ฐฑ์ ๋์ด์ ๊ฐ์ฑ ๋ณํ๋ team1๊ณผ team2 ๋ฅผ ์ด๊ธฐํ ์์ผ์ฃผ๊ณ ,
- for ๋ฌธ์ ๋๋ ค์ ๋ฐฉ๋ฌธํ๋ (true)์ธ ์ ๋ค์ team1๋ก, ๋ฐฉ๋ฌธํ์ง ์์๋ (false)์ธ ์ ๋ค์ team2๋ก ๋ณด๋ด๋ฉด์ ๋ฅ๋ ฅ์น๊ฐ์ ๋ํด์ค
- ๋ง์ง๋ง์ผ๋ก team1์์ team2๋ฅผ ๋บ ์ ๋๊ฐ์ minResult์ ๋น๊ตํด์ ๋ฃ์ด์ค.
// depth ๊ฐ ๋ฐ์ด๋๋ค๋ ๋ป์ ์ด๋ฏธ ํ ํ ๊ตฌ์ฑ์ด ์๋ฃ ๋๋ค๋ ๋ป
// ๊ทธ๋์ depth/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))
๐ป ์ต์ข ์ฝ๋
GitHub - deslog/Algorithm
Contribute to deslog/Algorithm development by creating an account on GitHub.
github.com
let n = Int(String(readLine()!))!
var s = Array(repeating: Array(repeating: 0, count: n), count: n)
var visited = Array(repeating: false, count: n)
var team1 = 0
var team2 = 0
var minResult = 99999
for i in 0..<n {
s[i] = readLine()!.split(separator: " ").map { Int(String($0))! }
}
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
}
}
}
dfs(depth: 0, start: 0)
print(minResult)
'Algorithm > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค](Swift) 2667๋ฒ - ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ (DFS์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ ) (1) | 2022.05.27 |
---|---|
[๋ฐฑ์ค] (Swift) 1707๋ฒ - ์ด๋ถ๊ทธ๋ํ (DFS๋ก ํ๊ธฐ!) (0) | 2022.05.25 |
[๋ฐฑ์ค] (Swift) 11724๋ฒ - ์ฐ๊ฒฐ ์์์ ๊ฐ์ (DFS ์ฐ์ต) (0) | 2022.05.20 |
[๋ฐฑ์ค] (Swift) 14501๋ฒ - ํด์ฌ (DP๋ก ํ๊ธฐ) (0) | 2022.05.17 |
[๋ฐฑ์ค] (Swift) 1260๋ฒ - DFS์ BFS (0) | 2022.05.14 |