λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ“– Problem Solution/Programmers

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ κ°€μž₯ 큰 μ •μ‚¬κ°ν˜• μ°ΎκΈ° Swift

by Fomagran πŸ’» 2020. 10. 23.
728x90
λ°˜μ‘ν˜•
 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - κ°€μž₯ 큰 μ •μ‚¬κ°ν˜• μ°ΎκΈ°

[[0,1,1,1],[1,1,1,1],[1,1,1,1],[0,0,1,0]] 9

programmers.co.kr

 

 

Foma's 풀이

λ¬Έμ œν’€μ΄

이 λ¬Έμ œλŠ” λ™μ κ³„νšλ²•(Dynamic Programming)으둜 ν’€μ–΄μ•Ό ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

 

λ™μ κ³„νšλ²•μ— λŒ€ν•΄μ„œλŠ” dojinkimm.github.io/algorithm/2019/10/17/dp-1.html μ΄κ³³μ„ μ°Έκ³ ν•΄μ£Όμ„Έμš”!

 

Dynamic Programming(동적 κ³„νšλ²•)μ΄λž€?

Dynamic Programming(동적 κ³„νšλ²•)

dojinkimm.github.io

κ°„λ‹¨ν•˜κ²Œ μ„€λͺ…λ“œλ¦¬λ©΄ boardμ•ˆμ˜ 숫자λ₯Ό μ°¨λ‘€λ‘œ λŒλ©΄μ„œ nκ³Ό 같은 μ—΄μ—μ„œ μœ—μͺ½ ν–‰μ˜ 수,μžμ‹ λ³΄λ‹€ ν•˜λ‚˜ μ•žμ„  μ—΄μ—μ„œ μœ—μͺ½μ˜ 수, μžμ‹ κ³Ό 같은 ν–‰μ—μ„œ ν•˜λ‚˜ μ•žμ„  수 즉,μžμ‹ μ„ λ‘˜λŸ¬μ‹Ό 수 쀑 κ°€μž₯ μž‘μ€ 수λ₯Ό nμ—κ²Œ 더해주면 λ©λ‹ˆλ‹€. 

 

κ·Έ λ‹€μŒ 바뀐 n듀쀑 κ°€μž₯ 큰 μˆ«μžμ— μ œκ³±μ„ ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€. 이와 같이 ν’€μ–΄μ£Όμ‹œλ©΄ κ°€μž₯ μ•ˆμͺ½μ˜ μˆ˜λŠ” μ •μ‚¬κ°ν˜•μ˜ ν–‰(μ—΄)을 μ•Œ 수 있게 λ©λ‹ˆλ‹€.

 

μ˜ˆμ‹œλ‘œ μ„€λͺ…λ“œλ¦¬λ©΄ μ•„λž˜ ν‘œμ—μ„œ κ°€μš΄λ° μˆ«μžκ°€ n이라면 빨간색이 되고 μžμ‹ μ„ λ‘˜λŸ¬μ‹Ό μ„Έκ°œμ˜ μˆ˜λŠ” νŒŒλž€μƒ‰μ΄ λ©λ‹ˆλ‹€. νŒŒλž€μƒ‰μΈ 숫자 쀑 κ°€μž₯ μž‘μ€ μˆ˜λŠ” 0μ΄λ―€λ‘œ 빨간색인 1에 0을 λ”ν•œλ‹€λ©΄ 1이 λ˜λ―€λ‘œ n은 1 κ·ΈλŒ€λ‘œ λ‚¨μŠ΅λ‹ˆλ‹€.

0 1 1
0 1 1
1 0 1

λͺ¨λ“  μˆ˜μ— 이것을 μ μš©ν•˜λ©΄ 이와 같이 λ³€ν•˜κ³  이 쀑 κ°€μž₯ 큰 μˆ˜λŠ” 2μ΄λ―€λ‘œ 2의 μ œκ³±μ€ 4κ°€ λ˜μ„œ κ°€μž₯ 큰 μ •μ‚¬κ°ν˜•μ˜ λ„“μ΄λŠ” 4κ°€ λ©λ‹ˆλ‹€.

0 1 1
0 1 2
1 0 1

μ½”λ“œμ„€λͺ…

κ°€μž₯ λ¨Όμ € findMinν•¨μˆ˜μ™€ solution의 board값을 κ³΅μœ ν•˜κΈ° μœ„ν•΄ boardλ₯Ό λ³΅μ‚¬ν•œ 값을 담을 λ³€μˆ˜λ₯Ό λ§Œλ“€μ–΄μ€λ‹ˆλ‹€. - > var boardCopy = [[Int]]()

 

κ·Έ λ‹€μŒ solution을 보기 전에 μ•„λž˜μ— μžˆλŠ” findMinν•¨μˆ˜λΆ€ν„° μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

findMin은 μΈμžκ°’μœΌλ‘œ n(ν˜„μž¬μ˜ 수)κ³Ό row(μ—΄),line(ν–‰)을 가지며 μ •μˆ˜λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

-> func findMin(_ n:Int,_ row:Int,_ line:Int-> Int {...)

 

λ°˜ν™˜κ°’μ„ 보면 nκ³Ό 같은 μ—΄μ—μ„œ μœ—μͺ½ ν–‰μ˜ 수 -> boardCopy[row][line-1]

 

μžμ‹ λ³΄λ‹€ ν•˜λ‚˜ μ•žμ„  μ—΄μ—μ„œ μœ—μͺ½μ˜ 수 -> boardCopy[row-1][line-1],

 

μžμ‹ κ³Ό 같은 ν–‰μ—μ„œ ν•˜λ‚˜ μ•žμ„  수 μ€‘ κ°€μž₯ μž‘μ€ 수 -> boardCopy[row-1][line]

 

μ—μ„œ κ°€μž₯ μž‘μ€ 값을 min() λ©”μ†Œλ“œλ₯Ό 톡해 λ°˜ν™˜ν•˜λ„λ‘ λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€. -> min(boardCopy[row-1][line],boardCopy[row-1][line-1],boardCopy[row][line-1])

 

solution을 μ‚΄νŽ΄λ³΄λ©΄ nλ“€ 쀑 κ°€μž₯ 큰 값을 μ €μž₯ν•  λ³€μˆ˜λ₯Ό λ§Œλ“€μ–΄μ€λ‹ˆλ‹€. -> var maxNum = 0

 

λ¨Όμ € μ—΄μ΄λ‚˜ 행이 1둜 λ˜μ–΄μžˆλŠ” λ³΄λ“œλŠ” μ •μ‚¬κ°ν˜•μ΄ 1이 κ°€μž₯ 크기 λ•Œλ¬Έμ— 1을 λ°˜ν™˜ν•΄μ€λ‹ˆλ‹€. - > if board.count == 1 || board.filter({$0.count > 1}).count == 0 { return 1 }

 

boardμ•ˆμ˜ 배열듀을 1λΆ€ν„° μ°¨λ‘€λ‘œ for문을 μ΄μš©ν•΄ νƒμƒ‰ν•©λ‹ˆλ‹€. (1λΆ€ν„° νƒμƒ‰ν•˜λŠ” μ΄μœ λŠ” 0번째 행은 μžμ‹ μ„ λ‘˜λŸ¬μ‹Ό μ„Έκ°œμ˜ 수λ₯Ό ꡬ할 μˆ˜κ°€ μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.) - > for i in 1..<board.count {...}

 

그리고 λ°”λ‘œ boardμ•ˆμ˜ λ°°μ—΄λ“€μ˜ μ•ˆμ„ for문을 μ΄μš©ν•΄ νƒμƒ‰ν•©λ‹ˆλ‹€. -> for j in 1..<board[i].count {...}

 

λ§Œμ•½ n이 0이 μ•„λ‹ˆλΌλ©΄ (λ§Œμ•½ 0이라면 μžμ‹ μ„ λ‘˜λŸ¬μ‹Ό 3개의 수λ₯Ό ꡬ할 ν•„μš”κ°€ μ—†μŒ. ) n에 κ°€μž₯ μž‘μ€ 수λ₯Ό 더해주고 이것이 κ°€μž₯ 큰 수라면 (max()λ©”μ†Œλ“œλ‘œ 비ꡐ) maxNum을 λ°”κΏ”μ€λ‹ˆλ‹€.(n은 board[i][j] 열은 i 행은 jκ°€ 될 κ²ƒμž…λ‹ˆλ‹€.)- > 

 if  boardCopy[i][j] != 0 {

                boardCopy[i][j] += findMin(board[i][j], i, j)

                maxNum = max(maxNum, boardCopy[i][j])

  }

 

boardμ•ˆμ˜ λ‹€ νƒμƒ‰ν•œ λ’€ maxNum에 pow()λ©”μ†Œλ“œ μ‚¬μš©ν•˜μ—¬ μ œκ³±ν•œ 값을 λ°˜ν™˜ν•΄μ€λ‹ˆλ‹€.(pow()λ©”μ†Œλ“œλŠ” μΈμžκ°’μ„ Double둜 λ°›μŠ΅λ‹ˆλ‹€.) ->

return  Int(pow(Double(maxNum),2.0))

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import Foundation
 
var boardCopy = [[Int]]()
 
func solution(_ board:[[Int]]) -> Int
{
    var maxNum = 0
boardCopy = board
    if board.count == 1 || board.filter({$0.count > 1}).count == 0 {
        return 1
    }
    for i in 1..<board.count {
        for j in 1..<board[i].count {
            if  boardCopy[i][j] != 0 {
                boardCopy[i][j] += findMin(board[i][j], i, j)
                maxNum = max(maxNum, boardCopy[i][j])
            }
        }
    }
    return  Int(pow(Double(maxNum),2.0))
}
 
func findMin(_ n:Int,_ row:Int,_ line:Int-> Int {
    
    return min(boardCopy[row-1][line],boardCopy[row-1][line-1],boardCopy[row][line-1])
}

μƒˆλ‘­κ²Œ μ•Œκ²Œ 된 것

nμ œκ³±μ„ ꡬ할 땐 pow(Double(n),Double(μ œκ³±ν•  수))λ₯Ό μ‚¬μš©ν•˜μ—¬ ꡬ할 수 μžˆλ‹€.

 

λ™μ κ³„νšλ²• 

 

728x90
λ°˜μ‘ν˜•

λŒ“κΈ€