ํฌ์ŠคํŠธ

๐ŸŒ“ Dynamic Programming

๐Ÿ’ซ Dynamic Programming (๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋™์  ๊ณ„ํš๋ฒ•)


์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ๋จผ์ € ํ‘ผ ํ›„์— ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์Œ“์•„์˜ฌ๋ ค์„œ ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ ํ™”์‹์„ ์ฐพ์•„๋‚ธ ํ›„ ์ ํ™”์‹์˜ ํ•ญ์„ ๋ฐ‘์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๊ตฌํ•ด๋‚˜๊ฐ€์„œ ๋‹ต์„ ์•Œ์•„๋‚ด๋Š” ํ˜•ํƒœ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜.

ํ”ผ๋ณด๋‚˜์น˜ ๋ฌธ์ œ
ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์˜ N๋ฒˆ์งธ ํ•ญ์„ ์ง€๊ธˆ์ฒ˜๋Ÿผ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ•˜๋ฉด ์ค‘๋ณต๋œ ์—ฐ์‚ฐ์ด ๊ณ„์† ๋ฐœ์ƒํ•ด์„œ O(1.618N)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ํ”ผ๋ณด๋‚˜์น˜ ๋ฌธ์ œ๋ฅผ DP๋กœ ํ•ด๊ฒฐํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๋ฏธ๋ฆฌ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด๋‘๊ณ  0๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์ฑ„์›Œ๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ณ  N+1์นธ์„ ์ฑ„์šฐ๊ณ  ๋‚˜๋ฉด ๋‹ต์„ ์•Œ ์ˆ˜ ์žˆ์œผ๋‹ˆ O(N)์— ๋‹ต์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด์„œ ์ด์šฉํ•˜๋Š”์ง€ ๊ทธ๋ ‡์ง€ ์•Š์€์ง€์— ๋”ฐ๋ผ ๊ทน์ ์ธ ์‹œ๊ฐ„๋ณต์žก๋„์˜ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

DP๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ํ…Œ์ด๋ธ”์„ ์ •์˜ํ•ด์•ผ ํ•˜๊ณ  ์ ํ™”์‹์„ ์ฐพ์€ ํ›„์— ์ดˆ๊ธฐ ๊ฐ’์„ ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
DP๋Š” ์ž‘์ •ํ•˜๊ณ  ์–ด๋ ต๊ฒŒ ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ํ•œ๋„ ๋๋„ ์—†์ด ์–ด๋ ค์›Œ์ง€์ง€๋งŒ, ์ฝ”ํ…Œ์— ๋‚˜์˜ฌ ์ˆ˜์ค€์˜ DP ๋ฌธ์ œ๋Š” ์ผ๋‹จ ์ ํ™”์‹๋งŒ ์ฐพ๊ณ ๋‚˜๋ฉด ๊ทธ ๋’ค๋Š” ์ดˆ๊ธฐ ๊ฐ’์„ ์ฑ„์›Œ๋„ฃ์€ ํ›„์— ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ ๋ฐฐ์—ด์„ ์ฑ„์šฐ๋ฉด ๋์ด์–ด์„œ ๊ตฌํ˜„์ด ๊ต‰์žฅํžˆ ์‰ฝ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‹ค์–‘ํ•œ DP ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ดค๊ฑฐ๋‚˜ ๋›ฐ์–ด๋‚œ ์ˆ˜ํ•™์  ์ง๊ด€๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ์ด์ƒ ๋ฌธ์ œ์—์„œ ์ ํ™”์‹์„ ์ด๋Œ์–ด๋‚ด๋Š” ๊ณผ์ •์ด ๊ทธ๋ ‡๊ฒŒ ์‰ฝ์ง€ ์•Š๊ณ , ๋ฌด์—‡๋ณด๋‹ค๋„ ์ดˆ๋ณด ๋‹จ๊ณ„์—์„œ๋Š” ์ฃผ์–ด์ง„ ๋ฌธ์ œ๊ฐ€ DP๋กœ ํ‘ธ๋Š” ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ ์ž์ฒด๋ฅผ ์•Œ์•„์ฐจ๋ฆฌ์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ์ง‘ ๋ฌธ์ œ ์กด๋‚˜ ํ’€์–ด๋ณผ ๊ฒƒ
1๋กœ ๋งŒ๋“ค๊ธฐ

๋ถ€๋ถ„์ œ๋ฅผ ๋ฏธ๋ฆฌ ํ’€๊ณ  ์ €์žฅํ•ด๋‘๊ธด ํ•˜๋Š”๋ฐ, ์ด๊ฒŒ ํ•ด๋‹ต์„ ๊ตฌํ• ๋•Œ ์“ฐ์ผ์ง€ ์•ˆ์“ฐ์ผ์ง€๋Š” ๋ชจ๋ฆ„.
์•„๋ฌดํŠผ ์ผ๋‹จ ๋ฏธ๋ฆฌ ๊ตฌํ•ด๋†“๊ณ  ๋ณด๋Š”๊ฒƒ์ด๋‹ค.

๊ฐ ๋ถ€๋ฌธ์ œ์˜ ํ•ด๋‹ต์„ ํ’€์–ด์„œ ์ €์žฅํ•˜๊ณ  ๋‚˜์ค‘์— ๊ฐ™์€ ๋ถ€๋ฌธ์ œ์˜ ๋‹ต์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ €์žฅ๋œ ํ•ด๋‹ต์„ ์ฐพ์•„์„œ ํ•ด๊ฒฐ

  • ๋ถ€๋ฌธ์ œ๋ฅผ ์ด์šฉํ•œ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ๋“ฌ
    • ์š•์‹ฌ์Ÿ์ด ๋ฐฉ๋ฒ•: ๊ฐ ๋‹จ๊ณ„์—์„œ ํ•ด๋‹ต์˜ ์ผ๋ถ€๋ฅผ ์„ ํƒํ•œ ํ›„ ๋‚จ์€ ๋ถ€๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ
    • ๋ถ„ํ• ์ •๋ณต: ๊ท€๋‚ฉ์  ์ •์˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ถ€๋ฌธ์ œ๋กœ ๋ถ„ํ• , ์ •๋ณต, ๊ฒฐํ•ฉ

๐Ÿซง vs Divide-Conquer

๋ถ„ํ• ์ •๋ณต์€ ๋ฌธ์ œ ์ž์ฒด๋ฅผ ๋‚˜๋ˆ„๊ณ  ํ‘ธ๋Š”๊ฑฐ๋ผ, ํ’€์–ด๋‘” ๊ฒƒ๋“ค์ด ๋‚˜์ค‘์— ํ•ด๋‹ต์„ ๊ตฌํ•  ๋•Œ ๋‹ค ์“ฐ์ธ๋‹ค.
์ค‘์ฒฉ๋œ ๋ถ€๋ฌธ์ œ ์Šคํƒˆ์ด๋ฉด ๋™์  ๊ณ„ํš๋ฒ•, ์•„๋‹ˆ๋ฉด ๋ถ„ํ•  ์ •๋ณต

  • ๊ณตํ†ต์ 
    • ์ˆœํ™˜์ ์œผ๋กœ ์ •์˜๋œ ๋ฌธ์ œ๋กœ๋ถ€ํ„ฐ ์ถœ๋ฐœ

@ 4_0000

  • ์ค‘์ฒฉ๋œ ๋ถ€๋ฌธ์ œ (Overlapping Subproblems) ํŠน์„ฑ
    • ๋ถ€๋ฌธ์ œ๋“ค์ด ์‹ฌํ•˜๊ฒŒ ์ค‘๋ณต๋˜๋Š” ๋ฌธ์ œ
    • DC : ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์ˆœํ™˜ ํ˜ธ์ถœ (4_0000), ์ฆ‰ ๋ถ€๋ฌธ์ œ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ๋ถ€๋ฌธ์ œ๋„ ๋งค๋ฒˆ ์ƒˆ๋กœ ํ’€์–ด์•ผ ํ•จ
    • DP : ๋™์ผํ•œ ๋ถ€๋ฌธ์ œ๊ฐ€ ๋ช‡ ๋ฒˆ ๋“ฑ์žฅํ•˜๊ฑด ๊ฐ„์— ํ•œ๋ฒˆ๋งŒ ํ’€๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ค‘๋ณต๋œ ๋ถ€๋ฌธ์ œ์˜ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด ํ• ์ˆ˜๋ก ์œ ๋ฆฌ
    • ๋ถ€๋ฌธ์ œ๊ฐ€ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ : DP์˜ ์žฅ์ ์ด ์˜๋ฏธ๊ฐ€ ์—†๊ณ , ์˜คํžˆ๋ ค ์ตœ์ข… ํ•ด๋‹ต์— ์“ฐ์ด์ง€ ์•Š์„ ๋‹ต์„ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•˜๋Š๋ผ ๋งŽ์€ ์‹œ๊ฐ„์„ ๋‚ญ๋น„
  • DC
    • ์ ํ•ฉํ•œ ์˜ˆ: ํ•ฉ๋ณ‘์ •๋ ฌ, ํ€ต์ •๋ ฌ
      • ๋ถ€๋ฌธ์ œ๋“ค์ด ์ค‘๋ณต๋˜์ง€ ์•Š์Œ: ์ค‘์ฒฉ๋œ ๋ถ€๋ฌธ์ œ ํŠน์„ฑ์ด ์—†์Œ
    • ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ์ชผ๊ฐ  ํ›„ ๋ถ€๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ์ „๋žต โ†’ ํ•˜ํ–ฅ์‹
  • DP
    • ์ ํ•ฉํ•œ ์˜ˆ: ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ๊ณ„์‚ฐ
      • ๋ถ€๋ฌธ์ œ๋“ค์ด ์‹ฌํ•˜๊ฒŒ ์ค‘๋ณต: ์ค‘์ฒฉ๋œ ๋ถ€๋ฌธ์ œ ํŠน์„ฑ์„ ๊ฐ€์ง
    • ๋ถ€๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋” ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ „๋žต โ†’ ์ƒํ–ฅ์‹
1
2
3
4
5
6
7
8
9
int IterativeFib(int n)
{
	int[] fib = new int[MAX_SIZE];
	fib[0] = 0;
	fib[1] = 1;
	for (int i = 2; i <= n; i++)
		fib[i] = fib[i - 1] + fib[i - 2];
	return fib[n];
}


๐Ÿซง vs Greedy

  • ๊ณตํ†ต์ : ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š” ์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ

์ตœ์ ํ•ด : ์ตœ๊ณ  ์ข‹์€ ํ•ด๋‹ต

  • ๊ทธ๋ฆฌ๋””
    • ์ตœ์ ํ•ด๋ฅผ ๋ณด์žฅํ•œ๋‹ค๋Š” ์ฆ๋ช…๋งŒ ๋˜๋ฉด ๊ฐ€์žฅ ํšจ์œจ์ 
    • ์ตœ์ ํ•ด์˜ ์ผ๋ถ€๋ฅผ ๋จผ์ € ์„ ํƒํ•œ ํ›„ ๋‚จ์€ ๋ถ€๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ์ „๋žต โ†’ ํ•˜ํ–ฅ์‹
  • ๋™์  ๊ณ„ํš๋ฒ•
    • ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ + ์ตœ์ ํ™” ๋ฌธ์ œ: ๋ฒ”์šฉ์„ฑ
    • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ๋Œ€์•ˆ๋“ค์˜ ๋‹ต์„ ๊ตฌํ•˜๊ณ  ๊ทธ ๊ฐ€์šด๋ฐ ์ตœ์ ์˜ ํ•ด๋‹ต์„ ์ฐพ์Œ โ†’ ์ง€๋Šฅ์ ์ธ ๋ฌด์ž‘์œ„ ๊ธฐ๋ฒ•, ์ƒํ–ฅ์‹

๐Ÿซง ๋™์  ๊ณ„ํš๋ฒ•์˜ ์ ์šฉ

  • โžŠ ์ตœ์ ํ™” ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ์ตœ์  ๋ถ€๋ถ„๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”์ง€ ๊ฒ€์ฆ
  • โž‹ ๋ฌธ์ œ๋ฅผ ์ˆœํ™˜์ ์œผ๋กœ ์ •์˜
  • โžŒ ์ค‘์ฒฉ๋œ ๋ถ€๋ฌธ์ œ ํŠน์„ฑ์„ ๊ฐ–๋Š”์ง€ ์กฐ์‚ฌ
  • โž ๋ถ€๋ฌธ์ œ์˜ ํ•ด๋‹ต์„ ์ €์žฅํ•˜๊ณ  ์ด๋กœ๋ถ€ํ„ฐ ์ตœ์ ํ•ด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌ์ถ•

๐Ÿซง Memoization

Memoization

๐Ÿ’ซ ์ •๋ฆฌ


  • ์ •๋ฆฌ
    • ์ตœ์  ๋ถ€๋ถ„๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š” ์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
    • ํŠนํžˆ ๋ถ€๋ฌธ์ œ๊ฐ€ ์ค‘์ฒฉ๋˜๋Š” ์ •๋„๊ฐ€ ๋†’์„์ˆ˜๋ก ์œ ์šฉ
    • ํฌ๊ธฐ ๋ณ„๋กœ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ๋ฏธ๋ฆฌ ํ’€์–ด๋†“๊ณ  ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€๋Šฅํ™”๋œ ๋ฌด์ž‘์œ„ ๊ธฐ๋ฒ•์ด๋ผ๋Š” ๋ณ„์นญ

์ค‘์ฒฉ๋„๊ฐ€ ๋†’์œผ๋ฉด, ๋ถ€๋ฌธ์ œ๊ฐ€ ๋˜‘๊ฐ™์€ ๊ฑธ ๋งŽ์ด ์“ฐ๋ฉด, ๋ฏธ๋ฆฌ ๋‹ค ํ’€์–ด๋‘๊ณ  ์“ฐ๋Š” ๋™์  ๊ณ„ํš๋ฒ•
๋‚ฎ์œผ๋ฉด ๋ฏธ๋ฆฌ ํ’€์–ด๋‘” ๋ถ€๋ฌธ์ œ๋ฅผ ์•ˆ์จ์„œ ํšจ์œจ์ด ๋‚ฎ์œผ๋‹ˆ๊นŒ, ์ฐจ๋ผ๋ฆฌ ๋ถ„ํ• ์ •๋ณต์„ ๊ณ ๋ คํ•ด๋ณผ๊ฒƒ

  • ๊ธฐํƒ€ ์˜ˆ์ œ
    • ๋ฐ์ดํ„ฐ์˜ ์œ ์‚ฌ์„ฑ์„ ์•Œ์•„๋‚ด๋Š”๋ฐ ์œ ์šฉํ•œ ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„์ˆœ์„œ (longest common subsequence) ๋ฌธ์ œ
    • 2์žฅ์—์„œ ๋‹ค๋ฃฌ ์—ฌํ–‰ํ•˜๋Š” ์™ธํŒ์› ๋ฌธ์ œ
    • ์Œ์„ฑ ์ธ์‹์ด๋‚˜ ํ•ฉ์„ฑ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋น„ํ„ฐ๋น„(Viterbi) ์•Œ๊ณ ๋ฆฌ์ฆ˜

๐Ÿ’ซ ์ด์šฉ


0-1-KnapSack-Problem
Algorithm-Bellman-Ford
Algorithm-Floyd-Warchall

์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.