๋ฌธ์
https://www.acmicpc.net/problem/14500
๋ด ๋ฌธ์ ํ์ด
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let n = input[0]
let m = input[1]
var paper = [[Int]]()
var result = 0
for _ in 0..<n { paper.append(readLine()!.split(separator: " ").map{Int(String($0))!}) }
func check(_ x: Int, _ y :Int, _ before: Int, _ count: Int, _ sum: Int) {
if count == 4 { result = max(result, sum); return }
if x-1 >= 0 && before != 1 { check(x-1, y, 2, count+1, sum+paper[x-1][y]) }
if x+1 < n && before != 2 { check(x+1, y, 1, count+1, sum+paper[x+1][y]) }
if y-1 >= 0 && before != 3 { check(x, y-1, 4, count+1, sum+paper[x][y-1]) }
if y+1 < m && before != 4 { check(x, y+1, 3, count+1, sum+paper[x][y+1]) }
}
func checkSpecial(_ x: Int, _ y: Int) {
// 'ใ
', 'ใ
'
if x+1 < n && y-1 >= 0 && y+1 < m {
result = max(result, max(paper[x][y] + paper[x+1][y-1] + paper[x+1][y] + paper[x+1][y+1], paper[x][y] + paper[x][y-1] + paper[x+1][y] + paper[x][y+1]))
}
// 'ใ
', 'ใ
'
if x+2 < n && y+1 < m {
result = max(result, max(paper[x][y] + paper[x+1][y] + paper[x+1][y+1] + paper[x+2][y], paper[x+1][y] + paper[x][y+1] + paper[x+1][y+1] + paper[x+2][y+1]))
}
}
for i in 0..<n {
for j in 0..<m {
check(i, j, 0, 1, paper[i][j])
checkSpecial(i, j)
}
}
print(result)
๐ dp๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ฃผ์์. ํ ํธ๋ก๋ฏธ๋ ธ๋ค์ ํน์ฑ(?)์ ํ์ ํ๊ณ , ์ ์ด์ฉํด์ฃผ์ด์ผ ํ๋ ๊ฒ์ด ํฌ์ธํธ
[ ๊ฐ๋ ์ ๋ฆฌ ]
๋ฌธ์ ์ ์ฃผ์ด์ง ๊ทธ๋ฆผ์ ๋ณด๋ฉด,
'ใ ' ๋ชจ์์ ํ ํธ๋ก๋ฏธ๋ ธ๋ฅผ ์ ์ธํ ๋๋จธ์ง ํ ํธ๋ก๋ฏธ๋ ธ๋ค์ ์ค๋ณต์์ด ๋ชจ๋ ์ ์ฌ๊ฐํ์ ์ง๋ ์ ์์ง๋ง
'ใ ' ๋ชจ์์ ๊ฒฝ์ฐ ์ค๋ณต์ ํผํ ์ ์๋ค.
์๋ฅผ๋ค์ด 1๋ฒ ์ ์ฌ๊ฐํ๋ถํฐ ์ด๋ํ๋ค๊ณ ํ๋ฉด, 1 -> 2 -> 4 -> 2 -> 3 ์ด๋ฐ ์์ผ๋ก ๊ผญ ์ค๋ณต์ด ์๊ธด๋ค.
๋ฐ๋ผ์ 'ใ ' ๋ชจ์์ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ์ค๋ณต ์์ด ๋ค ์ ์ฌ๊ฐํ์ด ์์นํ๋ ๊ฐ๋ค์ ์ต๋ ํฉ์ ๊ตฌํ ์ ์๋ค.
(์ฒ์์๋ dfs๋ก ํ์์ง๋ง dfs๋ก ํ ์์๋ ๋ชจ๋ ๋ชจ์์ ์์ด์ ์ค๋ณต์ ์ ์ธํ ์ ์๊ธฐ์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.)
=> 'ใ ' ๋ชจ์์ ํ ํธ๋ก๋ฏธ๋ ธ๋ ์์ธ๋ก ๊ตฌํด์ฃผ๊ณ , ๋๋จธ์ง ๋ชจ์๋ค์ dp๋ฅผ ํตํด ํจ์จ์ ์ผ๋ก ํ์ธํ ์ ์๋ค.
[ ๋ฌธ์ ํ์ด ]
- check ํจ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋จผ์ ์ค๋ช
ํด๋ณด์๋ฉด x์ y๋ ํ์์ ์์ํ๋ ์ขํ์ ์์น์ด๊ณ ,
count๋ ๋ช ๊ฐ์ ๋ธ๋ก์ ์ง๋ฌ๋์ง ์นด์ดํธ, sum์ ๊ฒฝ์ฐ์๋ ๋ธ๋ก์ ์ง๋๋ฉฐ ๋ํ ๊ฐ์ ์๋ฏธํ๋ค.
before๋ ๊ฐ์ฅ ์ค์ํ ์ธ์๋ผ๊ณ ์๊ฐํ๋๋ฐ,
์ด ์ฌ๊ทํจ์๊ฐ ์ด๋ฒ์ ์ด๋ค ๋ฐฉํฅ์ผ๋ก ์์ง์ธ๊ฑด์ง๋ฅผ ๋ํ๋ด์ฃผ์ด ์ค๋ณต์ ํผํ๊ฒ ํ๋ค.
์๋ฅผ ๋ค์ด, before๊ฐ 1์ด๋ผ๋ฉด ์ด์ ์ขํ์์ ํ ์นธ ์๋ก ์ฌ๋ผ์๋ค๋ ๊ฒ์ ๋ปํ๋ค.
๋ฐ๋ผ์ ๋ค์์ ํ์ํ ๋๋ ๋ค์ ์๋๋ก ํ ์นธ ๋ด๋ ค๊ฐ๋ ๊ฒ์ ์ค๋ณต์ธ ๊ฒ์ ์ ์ ์๊ณ , ํผํ ์ ์๋ค. - check ํจ์๋ before ์ธ์์ ๋ฐ๋ผ์ ์๋ง์ ์ฌ๊ทํจ์๋ฅผ ํธ์ถํด์ฃผ๊ณ ,
๋ count๊ฐ 4๊ฐ ๋์ ๋๋ result ๊ฐ๊ณผ sum ๊ฐ ์ค ๋ ํฐ ๊ฐ์ result์ ์ ์ฅํ ํ ๋ฆฌํดํ๋ค. - checkSpecial ํจ์๋ 'ใ
' ๋ชจ์์ ํ
ํธ๋ก๋ฏธ๋
ธ๋ค์ ์ฐพ๋ ์ญํ ์ ํ๋ค.
'ใ ' ๋ชจ์์ ์์์ ๋งํ๋ฏ์ด ์ค๋ณต์ ํผํ๋ฉด ์ ๋ ์ฐพ์ ์ ์๋ ๋ชจ์์ด๋ฏ๋ก ์ด๋ ๊ฒ ์์ธ๋ก ์ฒ๋ฆฌํ๋ค.
'ใ ', 'ใ ', 'ใ ', 'ใ ' ์ด๋ ๊ฒ ์ด ๋ค ๊ฐ์ง๋ง ํ์ธํ๋ฉด ๋๋ฏ๋ก, ์ฌ๊ทํธ์ถ ํ ํ์ ์์ด ์ผ์ผํ ํ์ธํด์ฃผ์๋ค.
๐ก ํผ๋๋ฐฑ
- ์ฒ์์๋ ์ด๋ป๊ฒ ํ์ด์ผ ํ ์ง ์์ ๊ฐ์ ๋ชป์ก์์ ์ด๋ป๊ฒ ์ ๊ทผํด์ผ ํ ์ง์ ๋ํด์๋ง ์ฐพ์๋ณด๊ณ ํ์๋๋ฐ,
์ค๋ณต์ ์๊ฐํ์ง ๋ชปํ๊ณ dfs๋ก ํ์๋ค๊ฐ ์๊ฐ์ด๊ณผ์๊ณ ,, ๊ทธ๋์ ๋ ๋ค์ ํ์๋ค. - 'ใ
' ๋ชจ์๋ง ์ ์ธํ๋ฉด ์ค๋ณต ์์ด ํ์ธํ ์ ์๋ค๋ ๋ถ๋ถ๋ง ์บ์นํ๋ฉด ํฌ๊ฒ ์ด๋ ค์ด ๋ฌธ์ ๋ ์๋ ๊ฒ ๊ฐ์ง๋ง
์ด์จ๋ ์๊ฐ์ด ์ค๋๊ฑธ๋ ธ๋ค,, ๋ค์์ ๋ค์ ํ ๋ฒ ํ์ด๋ด์ผ ํ๋ ๋ฌธ์ ๊ฐ๋ค.
'3๏ธโฃ Swift > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift Algorithm] ์๊ธฐ ์์ด BOJ #16236 (0) | 2022.01.25 |
---|---|
[Swift Algorithm] ์ ๋ก์์ฝ BOJ #10026 (0) | 2022.01.23 |
[Swift Algorithm] ์ด์ค์ฐ์ ์์ํ Programmers(Lv.3) (0) | 2021.12.21 |
[Swift Algorithm] ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ 4 BOJ #11659 (2) | 2021.10.20 |
[Swift Algorithm] 2รn ํ์ผ๋ง BOJ #11726 (0) | 2021.10.20 |
๋๊ธ