๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ–ฅ CS/Algorithm

[Algorithm/Swift] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค(Lv.2) - ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜• ์ฐพ๊ธฐ

์•ˆ๋…•ํ•˜์„ธ์š” ์ œ์ธ์ž…๋‹ˆ๋‹ค!

PS..๋ฅผ ๋“ค๊ณ  ์™”์Šต๋‹ˆ๋‹ค....ํ˜ผ์ž ํ•ด๊ฒฐ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋˜ ์ƒ๊ธด ๊ฒƒ์ด์ฃ ..์˜ˆ..

PS ์‹ค๋ ฅ์ด ์™œ ์ด๋ ‡๊ฒŒ ์•ˆ๋Š˜๊นŒ์š”....์ข€ ๋” ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ด์•ผ๊ฒ ์–ด์š”..

๋ฌธ์ œ ๋งํฌ

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

๋ฌธ์ œ ํ’€์ด

์ผ๋‹จ ์ด ๋ฌธ์ œ๋Š” DP(Dynamic Programming) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด ํ’€์–ด์•ผํ•˜๋Š” ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.

 

1915๋ฒˆ: ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•

์ฒซ์งธ ์ค„์— n, m(1 ≤ n, m ≤ 1,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ n๊ฐœ์˜ ์ค„์—๋Š” m๊ฐœ์˜ ์ˆซ์ž๋กœ ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ์—ฐ์Šต๋ฌธ์ œ๋ผ ๋ฐฑ์ค€์—๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

์ด ๋ฌธ์ œ๋Š” ๊ฐ„๋‹จํ•˜์ง€๋งŒ DP ๋ฌธ์ œ์˜ ๋Œ€ํ‘œ์ ์ธ ์œ ํ˜•(?) ๊ฐ™์•„์„œ ๋‚˜์ค‘์— ๋น„์Šทํ•œ ์œ ํ˜•์˜ ๋ฌธ์ œ๊ฐ€ ๋‚˜์™”์„ ๋•Œ ์‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋กํ•ด๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! (DP๋ฌธ์ œ๋Š” ์ด ๋ฌธ์ œ๋ฅผ DP๋กœ ํ’€์–ด์•ผ๊ฒ ๋‹ค๋Š” ๊ฐ์ด ์ž˜ ์•ˆ์˜ค๋Š” ๋ฌธ์ œ๊ฐ€ ๋งŽ๋”๋ผ๊ตฌ์š”..)

 

์ €๋Š” ์ฒ˜์Œ์— ์ ‘๊ทผ์„ dfs๋กœ ํ–ˆ๋Š”๋ฐ์š”,, dfs ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ขŒํ‘œ์ด๊ณ  1์ด๋ผ๋ฉด ํ•ด๋‹น ์ขŒํ‘œ์˜ ์˜ค๋ฅธ์ชฝ, ์•„๋ž˜์ชฝ์„ ํ™•์ธํ•ด์„œ ๊ฐ’์„ ๋”ํ•ด์ฃผ๋Š” ๋ฐฉ์‹(์žฌ๊ท€๋กœ ๋ฐ˜๋ณต)์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์‚ฌ๊ฐํ˜•์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•œ ๋‹ค์Œ, ์‚ฌ๊ฐํ˜• ์˜์—ญ ์ด์™ธ์˜ ์ขŒํ‘œ์˜ ๊ฐ’์ด ํฌํ•จ๋˜์–ด์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์•ž์˜ ๊ณผ์ •์—์„œ ๋„์ถœํ•œ ์ตœ๋Œ“๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ œ๊ณฑ๊ทผ์„ ๊ตฌํ•ด์„œ ๋‹ค์‹œ ์ œ๊ณฑํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ’€์—ˆ์Šต๋‹ˆ๋‹ค,,

๊ทผ๋ฐ ์ฝ”๋“œ๋ฅผ ์งœ๊ณ  ๋ณด๋‹ˆ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ขŒํ‘œ๋Š” ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ •์‚ฌ๊ฐํ˜•์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ฒดํฌ๊ฐ€ ์–ด๋ ต๊ณ , ์–ด๋–ค ์ขŒํ‘œ๋ฅผ ๋จผ์ € ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ ... ๋‹ค๋ฅธ ํ’€์ด ๋ฐฉ๋ฒ•์ด ๋– ์˜ค๋ฅด์ง€ ์•Š์•„ ๊ทธ๋ƒฅ ํ’€์ด ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ดค๋˜ ๊ฒƒ ๊ฐ™์•„์š”..ใ…Ž

 

์ด ๋ฌธ์ œ๋ฅผ DP๋ฅผ ์ด์šฉํ•ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฒ•์„ ์‰ฝ๊ฒŒ ์ดํ•ด๊ฐ€ ๊ฐ€๋„๋ก ๊ทธ๋ฆผ์œผ๋กœ ๋ด…์‹œ๋‹ค!

๋ฌธ์ œ์— ์ œ์‹œ๋œ ์ž…์ถœ๋ ฅ ์˜ˆ์ œ 1๋ฒˆ์˜ ์ž…๋ ฅ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ํ’€์ดํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค~!

์ด๋Ÿฐ ์‚ฌ๊ฐํ˜•์ด ์ฃผ์–ด์ง„๋‹ค๋ฉด, ์ด ์‚ฌ๊ฐํ˜• ๋‚ด์—์„œ ์ „๋ถ€ 1๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ธฐ๊ฐ€ 2*2์ธ ์ •์‚ฌ๊ฐํ˜•(1๊ฐœ ์ด์ƒ์˜ ์นธ์„ ๊ฐ€์ง€๊ณ  ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ •์‚ฌ๊ฐํ˜• ํฌ๊ธฐ)์„ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•ด๊ฐ€๋ฉฐ ์ตœ๋Œ€ ๋„“์ด๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

arr[1][1] ๋ถ€ํ„ฐ ์ขŒํ‘œ์˜ ๊ฐ’์„ ํ™•์ธํ•˜๋ฉฐ ํ•ด๋‹น ์ขŒํ‘œ์˜ ๊ฐ’์ด 1์ด๋ผ๋ฉด ํ˜„์žฌ ์ •์‚ฌ๊ฐํ˜• ๋ฒ”์œ„(arr[i-1][j], arr[i][j-1], arr[i-1][j-1]) ์•ˆ์— ์žˆ๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜๋ฅผ arr[i][j] ์— ๋”ํ•ด์„œ ํ˜„์žฌ๊นŒ์ง€ ํ™•์ธํ•œ ์ •์‚ฌ๊ฐํ˜•๋“ค์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ฐฑ์‹ ํ•ด๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐ™์€ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋‹ต์„ ๋„์ถœํ•ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‹ต์„ ๋„์ถœํ•ด๋‚˜๊ฐ€๋Š” ๊ณผ์ •์„ ๊ทธ๋ฆผ์œผ๋กœ ๋ณด๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ด๊ฐ€ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

(1,1) ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ 2*2 ์ •์‚ฌ๊ฐํ˜•์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์‚ฌ๊ฐํ˜•์˜ ๊ฒฝ์šฐ ์ตœ์†Ÿ๊ฐ’์ด 0์ด๊ธฐ ๋•Œ๋ฌธ์— (1,1)์˜ ๊ฐ’์€ ๊ทธ๋Œ€๋กœ 1์ด ๋ฉ๋‹ˆ๋‹ค. 

์ตœ์†Ÿ๊ฐ’์„ ๋”ํ•˜๋Š” ์ด์œ ๋Š” ์œ„์˜ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ์ตœ์†Ÿ๊ฐ’์ด 0์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฒ”์œ„์˜ ์‚ฌ๊ฐํ˜•์ด ๋ชจ๋‘ 1๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ์ง€ ์•Š๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ๊ฐํ˜•์˜ ๋ณ€์˜ ๊ธธ์ด๋ฅผ ์—…๋ฐ์ดํŠธ ์‹œ์ผœ์ฃผ์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ ์ž…๋‹ˆ๋‹ค!

arr์˜ ์ธ๋ฑ์Šค๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ฒซ๋ฒˆ์งธ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด ์œ„์™€ ๊ฐ™์€ ๊ณผ์ •์œผ๋กœ ๊ฐ’์ด ์ €์žฅ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์œ„์˜ ๊ทธ๋ฆผ๊นŒ์ง€ ์•ž์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋˜๋ฉด (2,3)์— ์ €์žฅ๋˜๋Š” ๊ฐ’์€ 3์ด ๋˜๋ฏ€๋กœ, ์ฃผ์–ด์ง„ ์‚ฌ๊ฐํ˜•์—์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•  ๋•Œ ์ด ๊ฐ’์— ์ œ๊ณฑ์„ ํ•ด์„œ ๋ฆฌํ„ดํ•ด์ฃผ๋ฉด ๋˜๊ฒ ์ฃ !!

์ฃผ์–ด์ง„ 2์ฐจ์› ๋ฐฐ์—ด์„ ๋๊นŒ์ง€ ์ˆœํšŒํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์œ„์˜ ๊ณผ์ •์ด ์ถ”๊ฐ€๊ฐ€ ๋˜๊ฒ ์ง€๋งŒ, ์ˆœํšŒ๊ฐ€ ๋๋‚œ ํ›„ ์ขŒํ‘œ์— ์ €์žฅ๋˜๋Š” ์ตœ๋Œ“๊ฐ’์€ ๊ทธ๋Œ€๋กœ 3์ด๋ฏ€๋กœ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ’์ธ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ Swift ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Swift ํ’€์ด ์ฝ”๋“œ

import Foundation

func solution(_ board:[[Int]]) -> Int {
    var arr = board
    var max = 0
    
    // ํ–‰์ด๋‚˜ ์—ด ๊ธธ์ด 1์ธ ๊ฒฝ์šฐ ๋”ฐ๋กœ ์ฒ˜๋ฆฌ
    if board.count == 1 || board[0].count == 1 {
        max = board.flatMap{$0}.contains(1) ? 1 : 0
    }
    
    for i in 1..<board.count {
        for j in 1..<board[0].count {
            if arr[i][j] == 1 {
                let min = [arr[i-1][j-1], arr[i-1][j], arr[i][j-1]].min()! // 2*2 ์ •์‚ฌ๊ฐํ˜• ์ค‘ ์ตœ์†Ÿ๊ฐ’
                arr[i][j] += min // ํ•ด๋‹น ์ขŒํ‘œ์— ์ตœ์†Ÿ๊ฐ’ ๋”ํ•จ
                max = arr[i][j] > max ? arr[i][j] : max // max๊ฐ’ ๊ฐฑ์‹ 
            }
        }
    }

    return max * max
}

[์ฐธ๊ณ  ์ž๋ฃŒ]

https://velog.io/@leeesangheee/Level-2-%EA%B0%80%EC%9E%A5-%ED%81%B0-%EC%A0%95%EC%82%AC%EA%B0%81%ED%98%95-%EC%B0%BE%EA%B8%B0-Swift

https://gimjinging.tistory.com/82

https://babbab2.tistory.com/131