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

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 15661๋ฒˆ - ๋งํฌ์™€ ์Šคํƒ€ํŠธ (feat. DFS, ์™„์ „ํƒ์ƒ‰, ๋ฐฑํŠธ๋ž˜ํ‚น)

๊ฐ์ž ๐Ÿฅ” 2023. 1. 29. 15:38
๋ฐ˜์‘ํ˜•

๐ŸŸ  ๋ฌธ์ œ

https://www.acmicpc.net/problem/15661

 

15661๋ฒˆ: ๋งํฌ์™€ ์Šคํƒ€ํŠธ

์ฒซ์งธ ์ค„์— N(4 ≤ N ≤ 20)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— S๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ค„์€ N๊ฐœ์˜ ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , i๋ฒˆ ์ค„์˜ j๋ฒˆ์งธ ์ˆ˜๋Š” Sij ์ด๋‹ค. Sii๋Š” ํ•ญ์ƒ 0์ด๊ณ , ๋‚˜๋จธ์ง€ Sij๋Š” 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 100

www.acmicpc.net

 

๐ŸŸ  ํ’€์ด ... ์™œ ์–ด๋ ต์ง€ ใ… ใ…  

์ด์ „์— ํ’€์—ˆ๋˜ ๋ฌธ์ œ '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)
}

 

 

๋ฐ˜์‘ํ˜•