⌨️ Language/swift

[μ½”λ“œνŠΈλ¦¬ μ±Œλ¦°μ§€] 2μ£Όμ°¨ - DP

hyebin (Helia) 2023. 9. 14. 20:51
λ°˜μ‘ν˜•

https://www.codetree.ai/missions/2/problems/maximin-path-in-square

 

μ½”λ“œνŠΈλ¦¬ | μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„λ₯Ό μœ„ν•œ μ•Œκ³ λ¦¬μ¦˜ 정석

κ΅­κ°€λŒ€ν‘œκ°€ λ§Œλ“  μ½”λ”© κ³΅λΆ€μ˜ κ°€μ΄λ“œλΆ μ½”λ”© μ™•μ΄ˆλ³΄λΆ€ν„° 꿈의 직μž₯ μ½”ν…Œ ν•©κ²©κΉŒμ§€, κ΅­κ°€λŒ€ν‘œκ°€ μ—„μ„ ν•œ 컀리큘럼으둜 μ€€λΉ„ν•΄λ³΄μ„Έμš”.

www.codetree.ai

 

μ •μˆ˜ μ‚¬κ°ν˜• μ΅œμ†Ÿκ°’μ˜ μ΅œλŒ€

문제

 ν–‰λ ¬μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ, μ—μ„œ μ‹œμž‘ν•˜μ—¬ 였λ₯Έμͺ½ ν˜Ήμ€ λ°‘μœΌλ‘œλ§Œ μ΄λ™ν•˜μ—¬  κ°„λ‹€κ³  ν–ˆμ„ λ•Œ 거쳐간 μœ„μΉ˜μ— μ ν˜€μžˆλŠ” μˆ«μžλ“€ 쀑 μ΅œμ†Ÿκ°’μ„ μ΅œλŒ€λ‘œ ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•΄ λ³΄μ„Έμš”.

μž…λ ₯ ν˜•μ‹

첫째 μ€„μ—λŠ” μ΄ μ£Όμ–΄μ§‘λ‹ˆλ‹€.

두 번째 쀄뢀터 κ°œμ˜ 쀄에 각각 각 행에 ν•΄λ‹Ήν•˜λŠ” κ°œμ˜ μ •μˆ˜ 값이 곡백을 사이에 두고 μ£Όμ–΄μ§‘λ‹ˆλ‹€.

  •  ν–‰λ ¬μ— μ£Όμ–΄μ§€λŠ” 숫자 

좜λ ₯ ν˜•μ‹

κ°€λŠ₯ν•œ 경둜의 μˆ«μžλ“€ 쀑 μ΅œμ†Ÿκ°’μ˜ μ΅œλŒ“κ°’μ„ 좜λ ₯ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예제

예제 1

μž…λ ₯: 

3
5 2 3
3 2 1
1 2 4

좜λ ₯:

2

예제 2

μž…λ ₯: 

3
4 3 2
3 4 5
4 2 8

좜λ ₯:

3

 

예제 μ„€λͺ…

첫 번째 예제의 경우 λ‹€μŒκ³Ό 같이 μ΄λ™ν•˜λ©΄ μ§€λ‚˜λŠ” κ²½λ‘œμ— μ ν˜€μžˆλŠ” μˆ«μžλ“€ 쀑 μ΅œμ†Ÿκ°’μ΄ κ°€ 되며, 더 크게 닡을 λ§Œλ“€ μˆ˜κ°€ μ—†μŠ΅λ‹ˆλ‹€.

 

μ œν•œ

μ‹œκ°„μ œν•œ: 1000ms
λ©”λͺ¨λ¦¬ μ œν•œ: 80MB

 


풀이

μ‹œμž‘μ  (0, 0)κ³Ό 0번째 μ—΄κ³Ό 행을 μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. 0번째 행은 자기 μžμ‹ κ³Ό λ°”λ‘œ μœ„μ˜ κ°’ 쀑 μž‘μ€ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•˜κ³ , 0번째 열은 자기 μžμ‹ κ³Ό μ™Όμͺ½μ˜ κ°’ 쀑 μž‘μ€ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.

 

(1,1)λΆ€ν„° (n-1, n-1)κΉŒμ§€ 연산을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. μžμ‹ μ˜ μ™Όμͺ½, μœ„μ˜ κ°’ 쀑 큰 κ°’κ³Ό 자기 μžμ‹ μ„ λΉ„κ΅ν•˜μ—¬ μž‘μ€ 값을 dp 배열에 μ €μž₯ν•©λ‹ˆλ‹€.

 

μ΅œμ’…μ μœΌλ‘œ dp[n-1][n-1]의 값을 좜λ ₯ν•©λ‹ˆλ‹€.

 

점화식
dp[i][j] = min(max(dp[i-1][j], dp[i][j-1]), arr[i][j])

μ½”λ“œ

let n = Int(readLine()!)!
var arr = [[Int]]()
var dp = Array(repeating: Array(repeating: 0, count: n), count: n)
var minValue = 0

for _ in 0..<n {
    arr.append(readLine()!.split(separator: " ").map{Int(String($0))!})
}

dp[0][0] = arr[0][0]

for i in 1..<n {
    dp[i][0] = min(dp[i-1][0], arr[i][0])
}

for j in 1..<n {
    dp[0][j] = min(dp[0][j-1], arr[0][j])
}

for i in 1..<n {
    for j in 1..<n {
        dp[i][j] = min(max(dp[i-1][j], dp[i][j-1]), arr[i][j])
    }
}

print(dp[n-1][n-1])

 

λ°˜μ‘ν˜•