Algorithm - 17. DP(2)

Mingi Shinยท2023๋…„ 12์›” 11์ผ
0

algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
17/23

๐Ÿ“Œ airtel ์˜ˆ์ œ

dp์— ๋Œ€ํ•œ ๋ถ€์กฑํ•œ ์ดํ•ด๋ฅผ ์œ„ํ•ด ์ฐธ๊ณ ์„œ์˜ ์˜ˆ์ œ๋ฅผ ๊ฐ€์ ธ์™”๋‹ค. ์—์–ดํ…” ๋ฌธ์ œ๋Š” ์ „ํ˜•์ ์ธ ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์ง€๋งŒ dp๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•œ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ถ„ํ• ์ •๋ณต ํ•ด๊ฒฐ๊ณผ์˜ ๋น„๊ต๋ฅผ ํ†ตํ•ด dp์˜ ์ˆ˜ํ–‰ ํšจ์œจ์„ ์•Œ์•„๋ณธ๋‹ค.

๋ฐฐ๊ฒฝ

  • n๊ฐœ์˜ ๋„์‹œ๊ฐ€ ์žˆ๋Š” ๋‚˜๋ผ์— ์‚ด๊ณ  ์žˆ๋‹ค.
  • ๋„์‹œ๋“ค์€ ์ผ์ง์„  ์ƒ์— ์œ„์น˜ํ•˜๋ฉฐ 0๋ถ€ํ„ฐ n-1๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ์žˆ๋‹ค.
  • 0๋ฒˆ ๋„์‹œ์—์„œ ์ถœ๋ฐœํ•ด n-1๋ฒˆ ๋„์‹œ๋กœ ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค.
  • ๋„์‹œ์™€ ๋„์‹œ๋Š” ์šฐ์ธก์œผ๋กœ๋งŒ ์ด๋™ํ•ด์•ผ ํ•˜๊ณ  ํ•˜๋ฃจ์— 1๊ฐœ ํ•ญ๊ณตํŽธ์„ ํƒˆ ์ˆ˜ ์žˆ๋‹ค.
  • ๋„์ฐฉํ•œ ๋„์‹œ์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ ๊ทธ ๋„์‹œ์˜ ํ˜ธํ…”์— 1๋ฐ•์„ ํ•ด์•ผํ•˜๊ณ  ๋‹ค์Œ ๋‚  ์•„์นจ ์ƒˆ๋กœ์šด ํ•ญ๊ณตํŽธ์„ ํƒˆ ์ˆ˜ ์žˆ๋‹ค.

์ „์ œ

  • ํ•ญ๊ณต ์š”๊ธˆ์€ ๋„์‹œ ๊ตฌ๊ฐ„์ด ๋ฉ€์ˆ˜๋ก ๋น„์‹ธ๊ณ  i(1 <= i <= n-1) ๊ตฌ๊ฐ„์— ๋Œ€ํ•œ ํ•ญ๊ณต ์š”๊ธˆ์€ ๋ฐฐ์—ด A์˜ A[i] ์›์†Œ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.
  • ์ˆ™๋ฐ• ์š”๊ธˆ์€ ๋ฐฐ์—ด H[1:n-2]์— ์ฃผ์–ด์ง„๋‹ค. ์ถœ๋ฐœ ๋„์‹œ, ๋„์ฐฉ ๋„์‹œ์˜ ์ˆ™๋ฐ• ์š”๊ธˆ์€ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ฌธ์ œ

  • ์ถœ๋ฐœ ๋„์‹œ 0์—์„œ ๋„์ฐฉ ๋„์‹œ n-1๊นŒ์ง€์˜ ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜๋ผ.

๊ฐœ์š”

๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋Œ€ํ•ด ๋ถ„ํ• ์ •๋ณต๊ณผ dp ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ๊ฐ ํ•ด๊ฒฐํ•˜๋ฉฐ ๋‘˜์˜ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•œ๋‹ค.

๋ฌธ์ œ ์ƒ ๊ณต๊ฐ„์€ 1์ฐจ์› ๋ฐฐ์—ด์— ๋‚˜์—ด๋œ n๊ฐœ์˜ ๋„์‹œ๋“ค์ด๋‹ค. ๋ถ„ํ• ์ •๋ณต๊ณผ dp ๋ฐฉ๋ฒ• ๊ฐ๊ฐ ์ •๋ฐฉํ–ฅ ํ•ด๊ฒฐ๊ณผ ์—ญ๋ฐฉํ–ฅ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉฐ ์ด 4๊ฐ€์ง€์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์กด์žฌํ•œ๋‹ค.

์ •๋ฐฉํ–ฅ ํ•ด๊ฒฐ์€ ์ถœ๋ฐœ ๋„์‹œ๋ฅผ 0์œผ๋กœ ๊ณ ์ •ํ•˜๊ณ  ๋„์ฐฉ ๋„์‹œ๋ฅผ ์ถœ๋ฐœ ๋„์‹œ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋„์‹œ 1๋ถ€ํ„ฐ ํ•˜์—ฌ n-1(๋ชฉํ‘œ ๋„์ฐฉ ๋„์‹œ)๊นŒ์ง€ ์ ์ง„์ ์œผ๋กœ ํ•ด๋ฅผ ๊ตฌํ•œ๋‹ค.

์—ญ๋ฐฉํ–ฅ ํ•ด๊ฒฐ์€ ๋„์ฐฉ ๋„์‹œ๋ฅผ n-1๋กœ ๊ณ ์ •ํ•˜๊ณ  ์ถœ๋ฐœ ๋„์‹œ๋ฅผ ๋„์ฐฉ ๋„์‹œ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋„์‹œ n-2๋ถ€ํ„ฐ ํ•˜์—ฌ 0(๋ชฉํ‘œ ์ถœ๋ฐœ ๋„์‹œ)๊นŒ์ง€ ์ ์ง„์ ์œผ๋กœ ํ•ด๋ฅผ ๊ตฌํ•œ๋‹ค.

๋ถ„ํ• ์ •๋ณต์€ ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ์จ ํ•ด๋ฅผ ๊ตฌํ•˜๋Š” ์ˆœ์„œ๊ฐ€ ์žฌ๊ท€ ํ˜ธ์ถœ๋กœ๋ถ€ํ„ฐ์˜ ๋ฐ˜ํ™˜ ์ˆœ์„œ์™€ ์ผ์น˜ํ•˜๋ฉฐ ์žฌ๊ท€ ํ˜ธ์ถœ ์ˆœ์„œ์™€๋Š” ๋ฐ˜๋Œ€๋‹ค. ๋ฐ˜๋ฉด dp๋Š” ๋น„์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ์จ ํ•ด๋ฅผ ๊ตฌํ•˜๋Š” ์ˆœ์„œ๊ฐ€ ๊ณ„์‚ฐ ์ˆœ์„œ์™€ ๊ทธ๋Œ€๋กœ ์ผ์น˜ํ•œ๋‹ค.

๋˜ํ•œ, ์ˆ™๋ฐ• ๋น„์šฉ H[0], H[n-1]์— 0์„ ์ €์žฅํ•˜๊ณ  ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์‹œ์ž‘ํ•œ๋‹ค.


๋ถ„ํ• ์ •๋ณต

์ •๋ฐฉํ–ฅ ํ•ด๊ฒฐ

airtel(n-1) //์ถœ๋ฐœ 0๋ถ€ํ„ฐ ๋„์ฐฉ n-1๋„์‹œ๊นŒ์ง€์˜ ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜๊ณ ์ž ํ•จ


Alg airtel(dest)
	input destination city dest
    output minCost of city 0 to dest

if(dest = 0){
	return 0
}

minCost <- big integer number	//์ตœ์†Œ๋น„์šฉ ๋งค์šฐ ํฐ ์ˆ˜๋กœ ์ดˆ๊ธฐํ™”

for k <- 0 to dest-1 {
	cost <- airtel(k) + H[k] + A[dest-k]
    minCost <- min(minCost, cost)
}
return mincost

airtel()์€ ๋„์ฐฉ ๋„์‹œ dest์— ๋Œ€ํ•ด ๋„์‹œ k๋ฅผ ๊ฒฝ์œ ํ•  ๊ฒฝ์šฐ์˜ cost๋ฅผ ๊ณ„์‚ฐํ•ด minCost๋ฅผ ๊ตฌํ•œ๋‹ค.

๊ทธ๋ฆผ์€ cost๋ฅผ ๊ตฌํ•˜๋Š” airtel(k) + H[k] + A[dest-k] ์ˆ˜ํ–‰ ๋‚ด์šฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. airtel(k)๋Š” ์ถœ๋ฐœ ๋„์‹œ์—์„œ k ๋„์‹œ๊นŒ์ง€์˜ ๋น„์šฉ์„ ์žฌ๊ท€ํ˜ธ์ถœ๋กœ ๊ตฌํ•˜๊ณ  k ๋„์‹œ์—์„œ์˜ ์ˆ™๋ฐ• ์š”๊ธˆ(H[k]), k ๋„์‹œ์—์„œ ๋ชฉ์ ์ง€ dest๊นŒ์ง€์˜ ํ•ญ๊ณต ์š”๊ธˆ(A[dest-k])์„ ๋”ํ•ด ๋„์‹œ k๋ฅผ ๊ฒฝ์œ ํ•˜๋Š” ๊ฒฝ์šฐ์˜ cost๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ O(2^n)์ด๋‹ค.

์—ญ๋ฐฉํ–ฅ ํ•ด๊ฒฐ

airtel(0) //์ถœ๋ฐœ ๋„์‹œ๊ฐ€ 0์ผ ๋•Œ์˜ ๋„์ฐฉ ๋„์‹œ n-1๊นŒ์ง€์˜ minCost

Alg airtel(start)
	input start city start
    output minCost of city start to n-1
    
if(start = n-1) {
	return 0
}

minCost <- big integer number

for k <- start+1 to n-1 {
	cost <- A[k-start] + H[k] + airtel(k)
    minCost <- min(minCost, cost)
}

return minCost

์—ญ๋ฐฉํ–ฅ์—์„œ์˜ airtel()์€ ์ถœ๋ฐœ ๋„์‹œ start์—์„œ ๋„์‹œ k๋ฅผ ๊ฒฝ์œ ํ•  ๋•Œ์˜ minCost๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

๊ทธ๋ฆผ์€ cost๋ฅผ ๊ตฌํ•˜๋Š” A[k-start] + H[k] + airtel(k) ์ˆ˜ํ–‰ ๋‚ด์šฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. s์—์„œ k๊นŒ์ง€์˜ ํ•ญ๊ณต ์š”๊ธˆ, k์—์„œ์˜ ์ˆ™๋ฐ• ๋น„์šฉ, k์—์„œ n-1๊นŒ์ง€์˜ minCost๋ฅผ ๋”ํ•ด cost๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

์—ญ๋ฐฉํ–ฅ ํ•ด๊ฒฐ์—์„œ์˜ ์ˆ˜ํ–‰ ์‹œ๊ฐ„๋„ O(2^n)์ด ๋œ๋‹ค. airtel ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ถ„ํ• ์ •๋ณต ํ•ด๊ฒฐ์€ ๊ณผ๋„ํ•œ ์ค‘๋ณต ํ˜ธ์ถœ๋กœ ์ธํ•ด ์‹œ๊ฐ„ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ์ €ํ•˜๋œ๋‹ค. ๋™์ผํ•œ ํ˜ธ์ถœ์ด ์ˆ˜ ์—†์ด ์ค‘๋ณต๋˜์–ด ๋ฌด๋ ค ์ง€์ˆ˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

dp ๋ฐฉ์‹์ด ๋ถ„ํ• ์ •๋ณต๊ณผ ๋‹ค๋ฅธ ์ ์€ ๋ฐฐ์—ด์— ์ค‘๊ฐ„ ๊ณ„์‚ฐํ•œ ๊ฐ’๋“ค์„ ๊ธฐ์–ต, ์ €์žฅํ•ด ์žฌ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ค‘๋ณต ์—ฐ์‚ฐ์„ ํ”ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.


๋™์ ๊ณ„ํš๋ฒ•

์ •๋ฐฉํ–ฅ ํ•ด๊ฒฐ

Alg airtel(n)
	input integer n
    output minCost of city 0 to n-1

minCost[0] <- 0		//์—ฐ์‚ฐ ์ €์žฅํ•  ๋ฐฐ์—ด minCost
for dest<-1 to n-1 {
	minCost[dest] <- big integer number
    
    for k<-0 to dest-1 {
    	cost <- minCost[k] + H[k] + A[dest-k]
        minCost[dest] <- min(minCost[dest], cost)
    }
}

return minCost[n-1]

minCost๋ผ๋Š” ์™ธ๋ถ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ์—ฐ์‚ฐ์„ ๊ธฐ์–ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๊ฐ„๋‹ค. minCost[i]๋Š” ์ถœ๋ฐœ ๋„์‹œ 0๋ถ€ํ„ฐ ๋„์‹œ i๊นŒ์ง€์˜ minCost๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์ถœ๋ฐœ ๋„์‹œ๋ถ€ํ„ฐ 0๊นŒ์ง€์˜ ๋น„์šฉ์€ 0์ด๊ธฐ์— minCost[0]์— 0์„ ์ €์žฅํ•œ๋‹ค.

dest๋Š” ๋„์‹œ 1๋ถ€ํ„ฐ ๋ชฉํ‘œ ๋„์ฐฉ ๋„์‹œ n-1๊นŒ์ง€๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉฐ, ๊ฐ ๋ฐ˜๋ณต๋งˆ๋‹ค 0๋ถ€ํ„ฐ dest๊นŒ์ง€์˜ minCost๋ฅผ ๊ตฌํ•œ๋‹ค.

๋‚ด๋ถ€ ๋ฐ˜๋ณต๋ฌธ์€ dest์— ๋Œ€ํ•ด ๋„์‹œ k๋ฅผ ๊ฒฝ์œ ํ•˜๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•œ๋‹ค. ๊ทธ๋ฆผ์€ cost๋ฅผ ๊ตฌํ•˜๋Š” ๊ณ„์‚ฐ ๋‚ด์šฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. minCost[k]๋Š” ๋ฐฐ์—ด์— ์ €์žฅ๋œ, 0๋ถ€ํ„ฐ k๊นŒ์ง€์˜ minCost์ด๋‹ค.

์—ญ๋ฐฉํ–ฅ ํ•ด๊ฒฐ

Alg airtel(n)
	input integer n
    output minCost of city 0 to n-1

minCost[n-1] <- 0	//n-1 to n-1 is 0

for start<-n-2 down to 0 {
	minCost[start] <- big integer number
    
    for k<-start+1 to n-1 {
    	cost <- A[k-start] + H[k] + minCost[k]
        minCost[start] <- min(minCost[start], cost)
    }
}

return minCost[0]

์—ญ๋ฐฉํ–ฅ ํ•ด๊ฒฐ์—์„œ์˜ minCost[i]๋Š” i๋ถ€ํ„ฐ ๋ชฉํ‘œ ๋„์ฐฉ ๋„์‹œ n-1๊นŒ์ง€์˜ ์ตœ์†Œ ๋น„์šฉ์„ ๋œปํ•œ๋‹ค.

start๋Š” ๋„์‹œ n-2๋ถ€ํ„ฐ ๋ชฉํ‘œ ์ถœ๋ฐœ ๋„์‹œ 0๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉฐ, ๊ฐ ๋ฐ˜๋ณต๋งˆ๋‹ค start๋ถ€ํ„ฐ n-1๊นŒ์ง€์˜ minCost๋ฅผ ๊ตฌํ•œ๋‹ค.

๋‚ด๋ถ€ ๋ฐ˜๋ณต๋ฌธ์€ start์— ๋Œ€ํ•ด ๋„์‹œ k๋ฅผ ๊ฒฝ์œ ํ•˜๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•œ๋‹ค. ๊ทธ๋ฆผ์€ cost๋ฅผ ๊ตฌํ•˜๋Š” ๊ณ„์‚ฐ ๋‚ด์šฉ์ด๋‹ค. minCost[k]๋Š” ๋ฐฐ์—ด์— ์ €์žฅ๋œ, k๋ถ€ํ„ฐ n-1๊นŒ์ง€์˜ minCost๋‹ค.

dp๋ฅผ ์ด์šฉํ•œ airtel ์˜ˆ์ œ ํ•ด๊ฒฐ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ O(n^2)๋กœ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋œ๋‹ค. dp๋Š” ์ค‘๋ณต๋˜๋Š” ๋ฌธ์ œ๋“ค์— ๋Œ€ํ•ด ์•„์˜ˆ ์™ธ๋ถ€ ๋ฐฐ์—ด์— ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ค‘๋ณต์„ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค.


์ฐธ๊ณ  : ๊ตญํ˜•์ค€. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์›๋ฆฌ์™€ ์‘์šฉ. 21์„ธ๊ธฐ์‚ฌ, 2018.

profile
@abcganada123 / git:ABCganada

0๊ฐœ์˜ ๋Œ“๊ธ€