[Swift - ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜• ์ฐพ๊ธฐ

2021. 5. 22. 17:14ใ†๐Ÿง‘๐Ÿป‍๐Ÿ’ป iOS ๊ฐœ๋ฐœ/Swift - Algorithm - Solutions

๐Ÿ•ต๐Ÿป  ๋ฌธ์ œ ํ•ด์„


1๊ณผ 0์œผ๋กœ ์ฑ„์›Œ์ง„ ํ‘œ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ๊ทธ ํ‘œ์—์„œ 1๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•์˜ ๋„“์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋‹จ, ์ •์‚ฌ๊ฐํ˜•์€ ์ถ•๊ณผ ํ‰ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ๋กœ ์ฃผ์–ด์ง„ 4 X 4์˜ ํ‘œ์—์„œ๋Š” ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•์˜ ๋„“์ด๊ฐ€ 9๊ฐ€ ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ œํ•œ์‚ฌํ•ญ

  • ํ‘œ(board)๋Š” 2์ฐจ์› ๋ฐฐ์—ด๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
  • ํ‘œ(board)์˜ ํ–‰(row)์˜ ํฌ๊ธฐ : 1,000 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜
  • ํ‘œ(board)์˜ ์—ด(column)์˜ ํฌ๊ธฐ : 1,000 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜
  • ํ‘œ(board)์˜ ๊ฐ’์€ 1 ๋˜๋Š” 0์œผ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ๊ฐ€์žฅ ์ž‘์€ ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋ถ€ํ„ฐ ํฌ๊ธฐ๋ฅผ ํ™•์žฅํ•˜๋ฉฐ ๋ฌธ์ œ์— ์ ‘๊ทผํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ž‘์€ ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์€ 1 X 1 ํฌ๊ธฐ์˜ 1๋กœ ์ด๋ฃจ์–ด์ง„ ์ •์‚ฌ๊ฐํ˜•์ด๊ฒ ์ฃ ? ๊ทธ๋‹ค์Œ ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์€ 2 X 2์˜ 1๋กœ ์ด๋ฃจ์–ด์ง„ ์ •์‚ฌ๊ฐํ˜•์ž…๋‹ˆ๋‹ค. 

์ด๋ ‡๊ฒŒ 4 X 4 ํฌ๊ธฐ์˜ ํ‘œ๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. ํŒŒ๋ž€์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋œ (1 , 1) ์œ„์น˜๋ฅผ ์ •์‚ฌ๊ฐํ˜•์˜ ์šฐํ•˜๋‹จ ๊ผญ์ง€์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ , 1๋กœ ์ด๋ฃจ์–ด์ง„ 2 X 2 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ์น ํ•ด์ง„ (0, 0), (0, 1), (1, 0) ์œ„์น˜์˜ ์ˆซ์ž๊ฐ€ ๋ชจ๋‘ 1 ์ธ์ง€๋ฅผ ํŒ๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.  ๋งŒ์•ฝ ๋นจ๊ฐ„์ƒ‰ ์œ„์น˜์˜ ์ˆซ์ž๊ฐ€ ๋ชจ๋‘ 1์ด๋ผ๋ฉด 2 X 2 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์ด ๋  ๊ฒƒ์ด๊ณ  ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ํŒŒ๋ž€์ƒ‰ ์œ„์น˜์˜ 1๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ 1 X 1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ํ™•์žฅํ•ด ๋‚˜๊ฐ€๊ธฐ์œ„ํ•ด ํ•ด๋‹น ์ขŒํ‘œ๋ฅผ 1๋กœ ์ด๋ฃจ์–ด์ง„ ์ •์‚ฌ๊ฐํ˜•์˜ ์šฐํ•˜๋‹จ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๊ทธ ์ขŒํ‘œ์˜ ๊ฐ’์— ์ •์‚ฌ๊ฐํ˜•์˜ ์ตœ๋Œ€ ๋ณ€์˜ ํฌ๊ธฐ๋ฅผ ์ €์žฅํ•˜๋Š” Square ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค. 

Board๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•œ Square ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. Square ๋ฐฐ์—ด์—๋Š” ํ•ด๋‹น ์ขŒํ‘œ๋ฅผ ์ •์‚ฌ๊ฐํ˜•์˜ ์šฐํ•˜๋‹จ์ด๋ผ๊ณ  ํ•˜์˜€์„ ๋•Œ ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•์˜ ๋ณ€์˜ ๊ธธ์ด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. 

๊ทธ๋ ‡๋‹ค๋ฉด ์กฐ๊ธˆ ๋” ํ™•์žฅํ•ด์„œ (R, C)์—์„œ 1๋กœ ์ด๋ฃจ์–ด์ง„ 3 X 3 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์ด ๋˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ๋˜์–ด์•ผ ํ• ๊นŒ์š”?

( R - 1 , C ), ( R - 1, C - 1 ), ( R , C - 1 ) ์ด ์„ธ ์ขŒํ‘œ๋ฅผ ์ •์‚ฌ๊ฐํ˜•์˜ ์šฐํ•˜๋‹จ์œผ๋กœ ํ•˜๋Š” 2 X 2 ์ •์‚ฌ๊ฐํ˜•์ด 3๊ฐœ๊ฐ€ ์กด์žฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋นจ๊ฐ„์ƒ‰, ํŒŒ๋ž€์ƒ‰, ์ดˆ๋ก์ƒ‰ ํ…Œ๋‘๋ฆฌ์˜ 2 X 2 ์ •์‚ฌ๊ฐํ˜•์ด ์กด์žฌํ•˜๋ฉด Board๋ฐฐ์—ด์—์„œ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ์น ํ•ด์ง„ ์ขŒํ‘œ๋Š” Square ๋ฐฐ์—ด์—์„œ 3์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ( R - 1 , C ), ( R - 1, C - 1 ), ( R , C - 1 ) ์ด ์„ธ ์ขŒํ‘œ๋ฅผ ์šฐํ•˜๋‹จ์œผ๋กœ ํ•˜๋Š” ์ •์‚ฌ๊ฐํ˜•๋“ค์˜ ๋ณ€์˜ ์ตœ์†Œ ํฌ๊ธฐ๊ฐ€ 1์ด๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ์น ํ•ด์ง„ ์ขŒํ‘œ์˜ Square๋ฐฐ์—ด์˜ ๊ฐ’์€ 2๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.  ์ด๋Ÿฐ ์‹์œผ๋กœ ํ™•์žฅํ•˜๋ฉด ์ตœ์ข…์ ์ธ Square ๋ฐฐ์—ด์˜ ๊ฐ’์ด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐฑ์‹ ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์„ค๋ช…ํ•œ ๋Œ€๋กœ Square ๋ฐฐ์—ด์— ์ •์‚ฌ๊ฐํ˜•์˜ ์ตœ๋Œ€ ๋ณ€์˜ ํฌ๊ธฐ๋ฅผ ๊ฐฑ์‹ ํ•˜์—ฌ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด Board๋ฐฐ์—ด์„ ํƒ์ƒ‰ํ•˜๋ฉฐ Square ๋ฐฐ์—ด์„ ๊ฐฑ์‹ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.  Board ๋ฐฐ์—ด์„ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ํ•ด๋‹น ์ขŒํ‘œ์˜ ์ˆซ์ž๊ฐ€ 1์ด๋ผ๋ฉด ํ•ด๋‹น ์œ„์น˜์˜ Square ๋ฐฐ์—ด์—์„œ ๋นจ๊ฐ„์ƒ‰ ์œ„์น˜์— ํ•ด๋‹นํ•˜๋Š” Square๋ฐฐ์—ด์˜ ๊ฐ’ ์ค‘ ์ตœ์†Ÿ๊ฐ’์„ ๋”ํ•˜์—ฌ ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. 

for row in 1..<board.count {
    for col in 1..<board[row].count {
        if board[row][col] == 1 {
            square[row][col] += min(square[row-1][col], square[row-1][col-1], square[row][col-1])
            maxVal = max(maxVal, square[row][col])
        }
    }
}   

 

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ Board ํ‘œ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ Square ๋ฐฐ์—ด์„ ๊ฐฑ์‹ ํ•˜๊ณ  Square ๋ฐฐ์—ด์˜ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ตฌํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ฐพ์œผ๋ ค๋Š” ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•์˜ ๋ณ€์˜ ๊ธธ์ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฃผ์–ด์ง„ Board์˜ ํ–‰์˜ ํฌ๊ธฐ๊ฐ€ 1์ด๊ฑฐ๋‚˜ ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 1์ธ ๊ฒฝ์šฐ ์˜ˆ์™ธ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์—ฌ ๋‹ต์„ ๊ตฌํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

๐Ÿคท๐Ÿป‍โ™‚๏ธ  ๋” ์ƒ๊ฐํ•ด๋ณด๊ธฐ


์ง€๊ธˆ ํ–‰์˜ ํฌ๊ธฐ๊ฐ€ 1์ด๊ฑฐ๋‚˜ ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 1์ผ ๊ฒฝ์šฐ ๋ฌด์กฐ๊ฑด ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•์˜ ํฌ๊ธฐ๋ฅผ 1๋กœ ๋ฆฌํ„ดํ•˜์—ฌ๋„ ์ •๋‹ต ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‘ ๊ฒฝ์šฐ์—์„œ ๋ชจ๋“  ์ˆซ์ž๊ฐ€ 0์ด๋ผ๋ฉด ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•์˜ ํฌ๊ธฐ๋ฅผ 0์œผ๋กœ ๋ฆฌํ„ดํ•ด์•ผ ๋งž๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์—์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๋“ฏ์‹ถ์Šต๋‹ˆ๋‹ค. 

๐Ÿ“ฆ  ๋ฌธ์ œ ํ’€์ด & ์ฝ”๋“œ


import Foundation

func solution(_ board:[[Int]]) -> Int
{
    var maxVal = 0
    var square = board
    
    // ํ–‰์˜ ํฌ๊ธฐ๊ฐ€ 1์ด๊ฑฐ๋‚˜ ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 1์ธ๊ฒฝ์šฐ
    if board.count == 1 || board.filter({$0.count > 1}).count == 0 {
        // 1์„ ํ•˜๋‚˜๋ผ๋„ ํฌํ•จ ํ•˜๋ฉด return 1
        for row in 0..<board.count {
            for col in 0..<board[i].count {
                if board[row][col] == 1 {
                    return 1
                }
            }
        }
        // ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด 0
        return 0
    }
    
    for row in 1..<board.count {
        for col in 1..<board[row].count {
       
            // ํ•ด๋‹น ์ขŒํ‘œ๊ฐ€ 1์ด๋ผ๋ฉด
            if board[row][col] == 1 {
            
                // ์„ธ ์ขŒํ‘œ๋ฅผ ์šฐํ•˜๋‹จ์œผ๋กœ ํ•˜๋Š” ์ •์‚ฌ๊ฐํ˜• ๋ณ€์˜๊ธธ์ด์˜ ์ตœ์†Ÿ๊ฐ’์„ ๋”ํ•ด์ค€๋‹ค.
                square[row][col] += min(square[row-1][col], square[row-1][col-1], square[row][col-1])
                
                // ์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹ 
                maxVal = max(maxVal, square[row][col])
            }
        }
    }
    // ์ œ๊ณฑํ•˜์—ฌ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•œ๋‹ค.
    return maxVal * maxVal
}