๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
3๏ธโƒฃ Swift/Problem Solving

[Swift Algorithm] ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ BOJ #14500

by seolhee2750 2022. 1. 19.
๋ฌธ์ œ

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

 

14500๋ฒˆ: ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ

ํด๋ฆฌ์˜ค๋ฏธ๋…ธ๋ž€ ํฌ๊ธฐ๊ฐ€ 1×1์ธ ์ •์‚ฌ๊ฐํ˜•์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ด์–ด์„œ ๋ถ™์ธ ๋„ํ˜•์ด๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค. ์ •์‚ฌ๊ฐํ˜•์€ ์„œ๋กœ ๊ฒน์น˜๋ฉด ์•ˆ ๋œ๋‹ค. ๋„ํ˜•์€ ๋ชจ๋‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ •์‚ฌ๊ฐํ˜•์˜ ๋ณ€

www.acmicpc.net

 

๋‚ด ๋ฌธ์ œ ํ’€์ด
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๋กœ ํ’€์—ˆ๋‹ค๊ฐ€ ์‹œ๊ฐ„์ดˆ๊ณผ์˜€๊ณ ,, ๊ทธ๋ž˜์„œ ๋˜ ๋‹ค์‹œ ํ’€์—ˆ๋‹ค.
  • 'ใ…—' ๋ชจ์–‘๋งŒ ์ œ์™ธํ•˜๋ฉด ์ค‘๋ณต ์—†์ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ถ€๋ถ„๋งŒ ์บ์น˜ํ•˜๋ฉด ํฌ๊ฒŒ ์–ด๋ ค์šด ๋ฌธ์ œ๋Š” ์•„๋‹Œ ๊ฒƒ ๊ฐ™์ง€๋งŒ
    ์–ด์จŒ๋“  ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ ธ๋‹ค,, ๋‹ค์Œ์— ๋‹ค์‹œ ํ•œ ๋ฒˆ ํ’€์–ด๋ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ™๋‹ค.

 

๋Œ“๊ธ€