Jieunny์˜ ๋ธ”๋กœ๊ทธ

S4) Unit 11. [์ž๋ฃŒ๊ตฌ์กฐ/์•Œ๊ณ ๋ฆฌ์ฆ˜] ์•Œ๊ณ ๋ฆฌ์ฆ˜ & ์‹œ๊ฐ„ ๋ณต์žก๋„ & ๊ณต๊ฐ„ ๋ณต์žก๋„ ๋ณธ๋ฌธ

CodeStates/learning contents

S4) Unit 11. [์ž๋ฃŒ๊ตฌ์กฐ/์•Œ๊ณ ๋ฆฌ์ฆ˜] ์•Œ๊ณ ๋ฆฌ์ฆ˜ & ์‹œ๊ฐ„ ๋ณต์žก๋„ & ๊ณต๊ฐ„ ๋ณต์žก๋„

Jieunny 2023. 4. 5. 12:00

๐Ÿ“ฃ  ์•Œ๊ณ ๋ฆฌ์ฆ˜

๐Ÿญ. ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฐœ๋…

โœ”๏ธ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ผ๋ จ์˜ ์ ˆ์ฐจ๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ณต์‹ํ™”ํ•œ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ ์ผ์ข…์˜ ๋ฌธ์ œ ํ’€์ด ๋ฐฉ๋ฒ•

โžฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” input ๊ฐ’์„ ํ†ตํ•ด output ๊ฐ’์„ ์–ป๊ธฐ ์œ„ํ•œ ๊ณ„์‚ฐ ๊ณผ์ •์„ ์˜๋ฏธ

    ใ„ด ์ž…๋ ฅ(input) : ์ถœ๋ ฅ์— ํ•„์š”ํ•œ ์ž๋ฃŒ

    ใ„ด ์ถœ๋ ฅ(output) : ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋์ด ๋‚ฌ๋‹ค๋Š” ์˜๋ฏธ๋กœ ์‹คํ–‰์ด ๋๋‚˜๋ฉด ์ ์–ด๋„ ํ•œ๊ฐ€์ง€ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

    ใ„ด ์œ ํ•œ์„ฑ(Finiteness) : ์œ ํ•œํ•œ ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„, ์œ ํ•œํ•œ ์‹œ๊ฐ„ ๋‚ด์— ์ข…๋ฃŒํ•ด์•ผ ํ•œ๋‹ค.

    ใ„ด ๋ช…ํ™•์„ฑ(Definiteness) : ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฐ ๋‹จ๊ณ„๋Š” ๋‹จ์ˆœํ•˜๊ณ  ๋ช…ํ™•ํ•ด์•ผ ํ•˜๋ฉฐ, ๋ชจํ˜ธํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

    ใ„ด ํšจ์œจ์„ฑ(Efficiency) : ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ€๋Šฅํ•œ ํ•œ ํšจ์œจ์ ์ด์–ด์•ผ ํ•œ๋‹ค.

 

๐Ÿฎ. ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ค‘์š”์„ฑ

โœ”๏ธ ์ ˆ์ฐจ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„๋˜์–ด ์žˆ๊ณ , ํšจ์œจ์ ์ด๋ฏ€๋กœ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ๋ถˆํ•„์š”ํ•œ ์ž‘์—…๋“ค์„ ์ค„์—ฌ์ค€๋‹ค.

โžฐ ์ •ํ™•ํ•˜์ง€ ์•Š์€ ๋‹ต์€ ํ˜ผ๋ž€์„ ์ฃผ๊ณ , ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž์ฒด์— ํฐ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•˜๋ฏ€๋กœ ์ •ํ™•ํ•˜๊ฒŒ ์งœ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

 

๐Ÿฏ. ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž˜ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•

1๏ธโƒฃ ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•œ๋‹ค.

โžฐ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ํ† ๋Œ€๋กœ ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

 

2๏ธโƒฃ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ „๋žต์„ ์„ธ์šด๋‹ค.

โžฐ ์ˆ˜๋„์ฝ”๋“œ๋ถ€ํ„ฐ ์ž‘์„ฑํ•ด ๋ณธ๋‹ค.

 

3๏ธโƒฃ ์ „๋žต์„ ์ฝ”๋“œ๋กœ ์˜ฎ๊ฒจ๋ณธ๋‹ค.

โžฐ ์ „๋žต์„ ์ฝ”๋“œ๋กœ ์˜ฎ๊ธฐ๊ณ , ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•ด๋ณธ๋‹ค.


๐Ÿ“ฃ  ์‹œ๊ฐ„ ๋ณต์žก๋„

๐Ÿญ. ์‹œ๊ฐ„ ๋ณต์žก๋„

โœ”๏ธ ์ž…๋ ฅ๊ฐ’์˜ ๋ณ€ํ™”์— ๋”ฐ๋ผ ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•  ๋•Œ, ์—ฐ์‚ฐ ํšŸ์ˆ˜์— ๋น„ํ•ด ์‹œ๊ฐ„์ด ์–ผ๋งˆ๋งŒํผ ๊ฑธ๋ฆฌ๋Š”๊ฐ€?

โžฐ ๋น…-์˜ค ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ด์„œ ๋‚˜ํƒ€๋‚ธ๋‹ค.

 

๐Ÿฎ. Big-O ํ‘œ๊ธฐ๋ฒ•

โœ”๏ธ ์ตœ์•…์˜ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๊ณผ์ •์—์„œ ์†Œ์š”๋˜๋Š” ์ตœ์•…์˜ ์‹œ๊ฐ„๊นŒ์ง€ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค.

1๏ธโƒฃ O(1)

โžฐ constant complexity๋กœ, ์ž…๋ ฅ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋”๋ผ๋„ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

โžฐ ์ž…๋ ฅ ๊ฐ’์˜ ํฌ๊ธฐ์™€ ์ƒ๊ด€์—†์ด ์ฆ‰์‹œ ์ถœ๋ ฅ๊ฐ’์„ ์–ป์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

function O_1_algorithm(arr, index) {
	return arr[index];
}

let arr = [1, 2, 3, 4, 5];
let index = 1;
let result = O_1_algorithm(arr, index);
console.log(result); // 2

 

2๏ธโƒฃ O(n)

โžฐ linear complexity๋กœ, ์ž…๋ ฅ๊ฐ’์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์‹œ๊ฐ„๋„ ๊ฐ™์€ ๋น„์œจ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

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

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

โžฐ ์ž…๋ ฅ๊ฐ’์ด 1 ์ฆ๊ฐ€ํ•  ๋•Œ ๋งˆ๋‹ค ์‹คํ–‰ ์‹œ๊ฐ„๋„ 1์ดˆ์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค => ๊ฐ™์€ ๋น„์œจ๋กœ ์ฆ๊ฐ€

โžฐ 2n, 5n๋„ ๋ชจ๋‘ O(n)์œผ๋กœ ํ‘œ๊ธฐํ•œ๋‹ค.

 

3๏ธโƒฃ O(log n)

โžฐ logarithmic complexity๋กœ, O(1) ๋‹ค์Œ์œผ๋กœ ๋น ๋ฅธ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

โžฐ BST ์ฒ˜๋Ÿผ ์ž…๋ ฅ๊ฐ’์ด ์ ˆ๋ฐ˜์œผ๋กœ ๊ณ„์† ์ค„์–ด๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•ด๋‹นํ•œ๋‹ค.

 

4๏ธโƒฃ O(n^2)

โžฐ quadratic complexity๋กœ, ์ž…๋ ฅ๊ฐ’์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์‹œ๊ฐ„์ด n์˜ ์ œ๊ณฑ์ˆ˜์˜ ๋น„์œจ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

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

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

โžฐ O(n^3), O(n^5)๋„ ๋ชจ๋‘ O(n^2)๋กœ ํ‘œ๊ธฐํ•œ๋‹ค.

 

5๏ธโƒฃ O(2^n)

โžฐ exponential complexity๋กœ, Big-O ํ‘œ๊ธฐ๋ฒ• ์ค‘ ๊ฐ€์žฅ ๋Š๋ฆฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

โžฐ ๋งค๋ฒˆ 2๋ฐฐ๋กœ ๋Š˜์–ด๋‚˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•ด๋‹นํ•˜๋ฉฐ ์žฌ๊ท€๋กœ ๊ตฌํ˜„ํ•˜๋Š” ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์ด ๋Œ€ํ‘œ์ ์ด๋‹ค.

function fibonacci(n) {
	if (n <= 1) {
		return 1;
	}
	return fibonacci(n - 1) + fibonacci(n - 2);
}

 

๐Ÿฏ. ๋ฐ์ดํ„ฐ ํฌ๊ธฐ์— ๋”ฐ๋ฅธ ์‹œ๊ฐ„ ๋ณต์žก๋„

โžฐ n ≤ 500 ์œผ๋กœ ์ž…๋ ฅ์ด ์ œํ•œ๋œ ๊ฒฝ์šฐ์—๋Š” O(n³)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๊ณ , ๊ตณ์ด O(log n)์œผ๋กœ ์ค„์ผ ํ•„์š”๋Š” ์—†์ง€๋งŒ, n ≤ 1000000์ธ ๊ฒฝ์šฐ์—๋Š” O(n) ๋˜๋Š” O(log n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ๋ฌธ์ œ๋ฅผ ํ’€์–ด์•ผ ํ•œ๋‹ค.

๋ฐ์ดํ„ฐ ํฌ๊ธฐ ์ œํ•œ ์˜ˆ์ƒ ์‹œ๊ฐ„ ๋ณต์žก๋„
n ≤ 1,000,000 O(n) or O (logn)
n ≤ 10,000 O(n2)
n ≤ 500 O(n3)

๐Ÿ“ฃ  ๊ณต๊ฐ„ ๋ณต์žก๋„

๐Ÿญ. ๊ณต๊ฐ„ ๋ณต์žก๋„

โœ”๏ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ˆ˜ํ–‰๋˜๋Š” ๋ฐ์— ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ด๋Ÿ‰์„ ์˜๋ฏธํ•œ๋‹ค.

โžฐ ํ”„๋กœ๊ทธ๋žจ์ด ํ•„์š”๋กœ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์‚ฐ์ถœํ•˜๋Š” ๊ฒƒ

โžฐ ๋น… ์˜ค (Big-O) ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

 

๐Ÿฎ. ๊ณต๊ฐ„ ๋ณต์žก๋„ ์˜ˆ์‹œ

function factorial(n) {
	if(n === 1) {
		return n;
	}
	return n*factorial(n-1);
}

โžฐ n์— ๋”ฐ๋ผ ๋ณ€์ˆ˜ n์ด n๊ฐœ ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋˜๋ฉฐ, factorial ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ 1๊นŒ์ง€ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ n๋ถ€ํ„ฐ 1๊นŒ์ง€ ์Šคํƒ์— ์Œ“์ด๊ฒŒ ๋œ๋‹ค.

โžฐ ์œ„ ํ•จ์ˆ˜์˜ ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(n) ์ด๋‹ค.

 

๐Ÿฏ. ๊ณต๊ฐ„ ๋ณต์žก๋„์˜ ์ค‘์š”์„ฑ

โžฐ ์‹œ๊ฐ„๋ณต์žก๋„ ๋ณด๋‹ค๋Š” ์ค‘์š”์„ฑ์ด ๋–จ์–ด์ง€์ง€๋งŒ, ๋™์  ๊ฒŒํš๋ฒ• ์ฒ˜๋Ÿผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‚˜ ํ•˜๋“œ์›จ์–ด ํ™˜๊ฒฝ์ด ๋งค์šฐ ํ•œ์ •๋œ ๊ฒฝ์šฐ ๊ณต๊ฐ„ ๋ณต์žก๋„๊ฐ€ ์ค‘์š”ํ•ด์ง„๋‹ค.

โžฐ ๋™์  ๊ณ„ํš๋ฒ•์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด๊ฐ€ ๊ตฌํ˜„ ์‹œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž…๋ ฅ๊ฐ’์˜ ๋ฒ”์œ„๊ฐ€ ๋„“์–ด์ง€๋ฉด ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ๊ณ , ํ•˜๋“œ์›จ์–ด ํ™˜๊ฒฝ์ด ๋งค์šฐ ํ•œ์ •๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ฐ€์šฉ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.