TIL

TIL47: [์ž๋ฃŒ๊ตฌ์กฐ/์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์ค€๋น„

Deviloper๐Ÿ˜ˆ 2021. 10. 7. 00:33

์˜ค๋Š˜์€ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•™์Šตํ–ˆ์Šต๋‹ˆ๋‹ค. ์„น์…˜2์—์„œ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณต๋ถ€ํ•  ๋•Œ, BFS์™€ DFS๊ฐ€ ์–ด๋ ค์› ์–ด์„œ ์‹œ์ž‘ํ•˜๊ธฐ ์ „๋ถ€ํ„ฐ ์ข€ ๊ฒ์„ ๋จน์€ ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์ „์— Toy Problem๊ณผ ์ฝ”ํ”Œ๋ฆฟ์œผ๋กœ ์—ฌ๋Ÿฌ๋ฒˆ ํž˜๋“ค์–ด๋ดค์–ด์„œ ๊ทธ๋Ÿฐ์ง€ ์ƒ๊ฐ์™ธ๋กœ ๊ดœ์ฐฎ์•˜์Šต๋‹ˆ๋‹คใ…Žใ…Ž

 

์‹œ๊ฐ„ ๋ณต์žก๋„(Time Complexity)

๋‹ค์Œ์˜ ์„ธ๊ฐ€์ง€ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ตœ์ƒ์˜ ๊ฒฝ์šฐ : ์˜ค๋ฉ”๊ฐ€ ํ‘œ๊ธฐ๋ฒ• (Big-Ω Notation)
  • ํ‰๊ท ์˜ ๊ฒฝ์šฐ : ์„ธํƒ€ ํ‘œ๊ธฐ๋ฒ• (Big-θ Notation)
  • ์ตœ์•…์˜ ๊ฒฝ์šฐ : ๋น…์˜ค ํ‘œ๊ธฐ๋ฒ• (Big-O Notation)

Big-O ์‹œ๊ฐ„๋ณต์žก๋„

 

function O_n(n) {
	for (let i = 0; i < n; i++) {
	// do something for 1 second
	}
}

function O_2n(n) {
	for (let i = 0; i < 2n; i++) {
	// do something for 1 second
	}
}

์ฒซ๋ฒˆ์งธ ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ๊ฐ’์ด 1 ์ฆ๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์ด 1์ดˆ์”ฉ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋‘๋ฒˆ์งธ ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ๊ฐ’์ด 1 ์ฆ๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์ด 2์ดˆ์”ฉ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰์‹œ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์ด๋ ‡๊ฒŒ ์žˆ์ง€๋งŒ ๋‘๋ฒˆ์งธ ํ•จ์ˆ˜ ๋˜ํ•œ ์ฒซ๋ฒˆ์งธ ํ•จ์ˆ˜์ฒ˜๋Ÿผ Big-O ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ O(n)์œผ๋กœ ํ‘œ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ๊ฐ’์ด ์ปค์ง€๋ฉด ์ปค์งˆ์ˆ˜๋ก ๊ณ„์ˆ˜(n ์•ž์— ์žˆ๋Š” ์ˆ˜)์˜ ์˜๋ฏธ(์˜ํ–ฅ๋ ฅ)๊ฐ€ ์ ์  ํ‡ด์ƒ‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ™์€ ๋น„์œจ๋กœ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด 2๋ฐฐ, 5๋ฐฐ, 10๋ฐฐ๋กœ ์ฆ๊ฐ€ํ•˜๋”๋ผ๋„ O(n)์œผ๋กœ ํ‘œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

 

  • ๊ฐ€์žฅ ๋น ๋ฅธ/๋А๋ฆฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?
    ๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(1)์ด๊ณ , ๊ฐ€์žฅ ๋А๋ฆฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(2์˜ n์ œ๊ณฑ) ์ž…๋‹ˆ๋‹ค.
  • ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌ์„ฑํ–ˆ๋‹ค ํ•จ์€ ๋ฌด์—‡์„ ์˜๋ฏธํ• ๊นŒ์š”?
    ์ž…๋ ฅ๊ฐ’์˜ ์ฆ๊ฐ€์— ๋”ฐ๋ผ ์ฆ๊ฐ€ํ•˜๋Š” ์‹œ๊ฐ„๋น„์œจ์„ ์ตœ์†Œํ™”ํ•œ ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” A์™€ B์˜ ๋น„๋ก€ํ•จ์ด ์–ด๋А ์ •๋„์ธ์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. A์™€ B๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?
    ์ž…๋ ฅ๊ฐ’๊ณผ ์‹คํ–‰๋˜๋Š” ์‹œ๊ฐ„์˜ ๋น„๋ก€ํ•จ์ด ์–ด๋А ์ •๋„์ธ์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

 

let i = n;
while (parseInt(i) > 0) {
  i = i / 2;
}

์œ„ ์ฝ”๋“œ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(log n) ์ž…๋‹ˆ๋‹ค.

 

for (let i = 0; i < n; i++) {
	i *= k;
}

์œ„ ์ฝ”๋“œ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(log k n)๋˜๋Š” O(log n) ์ž…๋‹ˆ๋‹ค.

 

 

 

Greedy Algorithm (ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜)

ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์•„๋ž˜ 2๊ฐ€์ง€์˜ ์กฐ๊ฑด์„ ์„ฑ๋ฆฝํ•ด์•ผ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. 

 

1. ํƒ์š•์  ์„ ํƒ ์†์„ฑ (Greedy Choice Property): ์•ž์˜ ์„ ํƒ์ด ์ดํ›„์˜ ์„ ํƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

2. ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ (Optimal Substructure): ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ตœ์ข… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ถ€๋ถ„ ๋ฌด์ œ์— ๋Œ€ํ•œ ์ตœ์  ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

 

 

ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹จ๊ณ„์ ์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

1. ์„ ํƒ ์ ˆ์ฐจ (Selection Procedure): ํ˜„์žฌ ์ƒํƒœ์—์„œ์˜ ์ตœ์ ์˜ ํ•ด๋‹ต์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

2. ์ ์ ˆ์„ฑ ๊ฒ€์‚ฌ (Feasibility Check): ์„ ํƒ๋œ ํ•ด๊ฐ€ ๋ฌธ์ œ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

3. ํ•ด๋‹ต๊ฒ€์‚ฌ (Solution Check): ์›๋ž˜์˜ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ , ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์„ ํƒ ์ ˆ์ฐจ๋กœ ๋Œ์•„๊ฐ€ ์œ„์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

 

ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์—์„œ ๋งค ์ˆœ๊ฐ„, ์ตœ์ ์ด๋ผ ์ƒ๊ฐ๋˜๋Š” ํ•ด๋‹ต์„ ์ฐพ์œผ๋ฉฐ, ์ด๋ฅผ ํ† ๋Œ€๋กœ ์ตœ์ข… ๋ฌธ์ œ์˜ ํ•ด๋‹ต์— ๋„๋‹ฌํ•˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ญ์ƒ ์ตœ์ ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•˜์ง€๋Š” ๋ชปํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

Dynamic Programming (DP; ๋™์  ๊ณ„ํš๋ฒ•)

์ฃผ์–ด์ง€ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜์œ„ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ’€๊ณ , ํ•˜์œ„ ๋ฌธ์ œ๋“ค์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์ตœ์ข… ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ฆ‰, ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ณ , ์ด ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ์ค‘๋ณตํ•ด์„œ ๋ฐœ๊ฒฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ์ž‘์€ ๋ฌธ์ œ์—์„œ ๊ตฌํ•œ ์ •๋‹ต์€ ๊ทธ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ํฐ ๋ฌธ์ œ์—์„œ๋„ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

DP์—๋Š” ํฌ๊ฒŒ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Recursion + Memoization (Top-down ๋ฐฉ์‹)

Memoization (๋ฉ”๋ชจํ™”): ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ผํ•œ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•ด์•ผํ•  ๋•Œ, ์ด์ „์˜ ๊ณ„์‚ฐ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•จ์œผ๋กœ์จ ๋™์ผํ•œ ๊ณ„์‚ฐ์˜ ๋ฐ˜๋ณต ์ˆ˜ํ–‰์„ ์ œ๊ฑฐํ•ด ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Iteration + Tabulation (Botom-up ๋ฐฉ์‹)

Top-down ๋ฐฉ์‹๋ณด๋‹ค ํ•จ์ˆ˜ ์‹คํ–‰์‹œ๊ฐ„์ด ๋” ์ ๊ฒŒ ๋“ญ๋‹ˆ๋‹ค.

 

ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก์ • ๋ฐฉ๋ฒ•

var t0 = performance.now();
fib(50); // ์—ฌ๊ธฐ์—์„œ ํ•จ์ˆ˜ ์‹คํ–‰์„ ์‹œ์ผœ์ฃผ์„ธ์š”
var t1 = performance.now();
console.log("runtime: " + (t1 - t0) + 'ms')