Potato
μ•ˆλ…•ν•˜μ„Έμš”, κ°μž‘λ‹ˆλ‹€?πŸ₯” ^___^ 😺 github λ°”λ‘œκ°€κΈ° πŸ‘‰πŸ»

Algorithm/Baekjoon

[λ°±μ€€] (Swift) 14889번 - μŠ€νƒ€νŠΈμ™€ 링크 (λ‘λ²ˆμ§Έ 풀이)(feat. DFS, 완전탐색)

감자 πŸ₯” 2023. 1. 29. 15:14
λ°˜μ‘ν˜•

🟠 문제

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에 λŒ€ν•œ κ°œλ…μ΄ 잘 μž‘νžˆμ§€ μ•Šμ€κ±΄κ°€. μ—­μ‹œλ‚˜ μž¬κ·€λΆ€λΆ„μ„ μƒκ°ν•˜λŠ”λ° μ’€.. νž˜λ“€μ—ˆλ‹€.. λ„λŒ€μ²΄ μž¬κ·€λ₯Ό μ–΄λ–»κ²Œ κ·Έλ ‡κ²Œ λ°”λ‘œλ°”λ‘œ μƒκ°ν•΄λ‚΄λŠ”κ±°μ§€..? μ•„λ‹Œκ°€ λ‹€λ“€ λ‚˜μ™€ 같은가?

μ–΄μ¨Œλ“  이번 λ¬Έμ œλŠ”, μž…λ ₯λ°›λŠ” Nλͺ…μ˜ μ‚¬λžŒλ“€μ„ 1/2둜 μͺΌκ°œμ„œ, λ”ν•΄μ£ΌλŠ” 값에 λŒ€ν•œ 차이의 μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” 것이닀. μš°μ„  λ°©λ¬Έ μ—¬λΆ€λ₯Ό νŒλ‹¨ν•΄μ„œ 계속 쑰합을 λ°”κΏ”κ°€λ©° ν™•μΈν•΄μ£Όμ–΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— DFS μž¬κ·€λ₯Ό μ‚¬μš©ν•΄μ„œ ν’€ 수 μžˆκ² κ΅¬λ‚˜ κΉŒμ§€ 생각할 수 μžˆμ—ˆλ‹€.

Nλͺ…μ˜ μ‚¬λžŒμ΄λΌκ³  치면, 이미 νŒ€μ΄ κ΅¬μ„±λœ μ‚¬λžŒμ€ 또 νŒ€μ„ ꡬ성할 μˆ˜μ—†λ‹€. 이것을 방문처리 VIsited배열에 μ €μž₯ν–ˆλ‹€. 그리고 λͺ‡λͺ…μ˜ μ‚¬λžŒκΉŒμ§€ λ„λ‹¬ν–ˆλŠ”μ§€λŠ” 트리의 depth둜 νŒλ‹¨ν•  것이닀. ν•œλ‹¨κ³„μ”© μž¬κ·€λ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ Depthκ°€ +1μ”© μ¦κ°€λ˜κ³ , 이 depthκ°€ n/2κ°€ λœλ‹€λ©΄ dfsλ₯Ό νƒˆμΆœν•˜λ„λ‘ λ§Œλ“€μ–΄μ•Όν•œλ‹€. νƒˆμΆœν•˜κΈ° μ „μ—λŠ”, visitedκ°€ true인 두λͺ…을 startνŒ€μ— λ„£μ–΄μ£Όκ³ , false인 두λͺ…을 linkνŒ€μ— 넣어쀄 것이닀!

이 과정을 그림으둜 κ·Έλ €λ³΄λ©΄μ„œ μ½”λ“œλ₯Ό κ΅¬μ„±ν•΄λ³΄μž.

🟠 μ •λ‹΅μ½”λ“œ

import Foundation

let n = Int(readLine()!)!
var s = [[Int]]()
var visited = Array(repeating: false, count: n)
var minResult = 999999

for _ in 0..<n {
    s.append(readLine()!.split(separator: " ").map{ Int($0)! })
}

private func dfs(depth: Int, start: Int) {
    if depth == n/2 {
        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
    }

    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)
λ°˜μ‘ν˜•