๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โŒจ๏ธ Language/swift

[์ฝ”๋“œํŠธ๋ฆฌ ์ฑŒ๋ฆฐ์ง€] 2์ฃผ์ฐจ - DP

by hyebin (Helia) 2023. 9. 14.
๋ฐ˜์‘ํ˜•

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])

 

๋ฐ˜์‘ํ˜•