๐ ๋ฌธ์
https://www.acmicpc.net/problem/18290
๐ ๋ด๊ฐ ํผ ํ์ด
์ฒ์ ๋ณด๊ณ ์์ ์ฐธ์์ DFS๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ฒ ๊ตฌ๋! ๊น์ง๋ ์๊ฐ์ด ๋ฌ๋ค. (์ด์ ์ ๋ฐ๋ณตํด์ ํผ N๊ณผ M๋ฌธ์ ๋๋ถ..)... ๊ทผ๋ฐ,,, ์ด์ ๊ทธ ํ์ ์ด๋ป๊ฒ ํด์ผํ ๊ฒ์ธ์ง ๊ณ ๋ฏผ์ด ํ์ํ๋ค.
๋ฌธ์ ๋ฅผ ์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- 2์ฐจ์ ๋ฐฐ์ด์ ์ ๋ ฅ๋ฐ๋๋ค (์ธ๋ก N ๊ฐ๋ก M)
- ๋ฐฐ์ด ๋ด๋ถ์์ K๊ฐ์ ์ซ์๋ฅผ ๋ฝ์์ ํฉ์๊ตฌํ ๊ฑด๋ฐ, ๊ทธ ํฉ์ด ์ต๋๊ฐ ๋์ด์ผ ํ๋ค.
- K๊ฐ๋ฅผ ๋ฝ์๋ ์ธ์ ํ ์ซ์๋ ๊ณ ๋ฅด๋ฉด ์๋๋ค.
์ผ๋จ,,, for๋ฌธ ๋๊ฐ๋ฅผ ๋๋ ค์ 2์ฐจ์ ๋ฐฐ์ด์ ๋์๊ฐ๋ฉด์ ํ๋์ฉ ์ ๋ถ ํ์ํด์ฃผ์ด์ผํ๋ค๊ณ ํ๋จํ๊ณ , ๊ทธ ํฉ์ ๊ตฌํ๋ ๊ณผ์ ์์ '์ํ์ข์ฐ'๋ก ๋๋ ค์ ๊ทธ ์ฃผ๋ณ์ visited๋ ์ด๋ ฅ์ด ์๋ค๋ฉด! ๋ํด์ฃผ๊ณ , ๋ง์ฝ ์๋ค๋ฉด ํด๋น ์์น๋ฅผ ๊ทธ๋ฅ ๋์ด๊ฐ๋ ๋ฐฉ์์ผ๋ก ์งํํด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
์ด๋ ๊ฒ ํ๋จ์ ํด๋ณด๊ณ , ์ฌ๊ท๋ฅผ ์ด์ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฌ๊ท๊ฐ ์ด๋ป๊ฒ ๋์๊ฐ๋์ง ๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ ค์ ์๊ฐํด๋ดค๋ค.
์ด๋ ๊ฒ ๋์๊ฐ๊ฒ ๋๊ฒ ์ง? ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ count ์ฆ, depth๊ฐ k (์ฌ๊ธฐ์ 3)๊ฐ ๋๋ ์๊ฐ dfs์์ return์ ํด์ฃผ๋ฉด ๋๋ค. ๊ทธ๋์ dfs๊ฐ ์์ํ ๋ depth๋ฅผ ๊ฒ์ฌํด์ฃผ๋ฉด ๋๊ฒ ๊ตฌ๋! ์ถ์๋ค. (N๊ณผ M ์๋ฆฌ์ฆ์ ์ฝ๋์ ํ๋ฌ๊ฐ๋๊ฒ ๊ฑฐ์ ๋์ผํ๋ค.
๐ ์ ๋ต์ฝ๋
return ํ๊ณ , ํด๋น ์งํํ๋ ๋ด์ฉ์ ๋ค์ ๋ฆฌ์ ํ๊ณ ํ์์ ๋์์ผํ๊ธฐ ๋๋ฌธ์ visited์์ false๋ฅผ ํด์ฃผ์๋ค.
์ค๊ฐ์ ์๋ tempY๋ ์๋์ ๊ฐ์ด ์ค๋ช ํ ์ ์๋ค.
๋ง์ฝ ์ด์ ํ๊ณผ ํ์ฌ ๋ฐ๋ผ๋ณผ ํ์ด ๊ฐ๋ค๋ฉด ์ด์ ์ด์ ์ด์ด์ ํ์ํ๊ณ , ๋ง์ฝ ์ด์ ํ๊ณผ ํ์ฌ ๋ฐ๋ผ๋ณผ ํ์ด ๊ฐ์ง ์๋ค๋ฉด 0๋ถํฐ ์์ํ๊ฒ ๋ค๋ ์ฝ๋์ด๋ค. ์ฆ, (1,2) -> (1,5) -> (3,4) ์์ (1,5) ๊ฐ ์์์ ์ด ๋ ๋ (1,2) ์๋ ํ์ด ๊ฐ์ผ๋ฏ๋ก (1,2)๋ฅผ ์ ์ธํ๊ณ ํ์ํ๊ฒ ๋๋ค.
(์ฐธ๊ณ : https://minoflower.tistory.com/50)
import Foundation
let nmk = readLine()!.split(separator: " ").map{ Int($0)! }
let n = nmk[0]
let m = nmk[1]
let k = nmk[2]
var arr = [[Int]]()
for _ in 0..<n {
arr.append(readLine()!.split(separator: " ").map{ Int($0)! })
}
var visited = Array(repeating: Array(repeating: false, count: m), count: n)
var answer = -999999
let dx = [-1, 1, 0, 0] // ์ํ์ข์ฐ
let dy = [0, 0, -1, 1]
private func dfs(px: Int, py: Int, depth: Int, maxNum: Int) {
if depth == k {
answer = max(maxNum, answer)
return
}
for x in px..<n {
let tempY = x == px ? py : 0
for y in tempY..<m {
if visited[x][y] {
continue
}
var flag = true
// ํด๋น xy ์ํ์ข์ฐ์ ํ๋๋ผ๋ ๋ฐฉ๋ฌธํ ์ด๋ ฅ์ด ์์ผ๋ฉด false
for i in 0..<4 {
let nx = x + dx[i]
let ny = y + dy[i]
if nx >= 0, ny >= 0, nx < n, ny < m {
if visited[nx][ny] {
flag = false
}
}
}
// flag๊ฐ ์์ง true๋ฉด ์ํ์ข์ฐ ์๋ฌด๋ฐ๋ ์์ง visited ํ์ ์ด ์๋ค๋ ๋ป
// ํด๋น ์์น (xy)์ ๋ฐฉ๋ฌธํด์ answer์ ๋ํด์ฃผ๊ณ dfs ๋๋ ค์ฃผ์
if flag {
visited[x][y] = true
dfs(px: x, py: y, depth: depth + 1, maxNum: maxNum + arr[x][y])
visited[x][y] = false
}
}
}
}
dfs(px: 0, py: 0, depth: 0, maxNum: 0)
print(answer)