Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 14889๋ฒˆ - ์Šคํƒ€ํŠธ์™€ ๋งํฌ (DFS-๋ฐฑํŠธ๋ž˜ํ‚น)

๊ฐ์ž ๐Ÿฅ” 2022. 5. 23. 21:42
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ๋งํฌ

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))

 

 

๐Ÿ’ป ์ตœ์ข… ์ฝ”๋“œ

https://github.com/deslog/Algorithm/blob/main/Algorithm/Boj/14889_%EC%8A%A4%ED%83%80%ED%8A%B8%EC%99%80%20%EB%A7%81%ED%81%AC/main.swift

 

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)
๋ฐ˜์‘ํ˜•