์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ/์•Œ๊ณ ๋ฆฌ์ฆ˜

๋น…์˜ค(Big O) ํ‘œ๊ธฐ๋ฒ•์ด ๋ญ˜๊นŒ? ์–ด๋–ป๊ฒŒ ๋ณด๋Š” ๊ฑฐ์ง€?

์šฉ๋‡ฝ 2023. 1. 6. 22:51
๋ฐ˜์‘ํ˜•

๋น…์˜ค(Big O) ํ‘œ๊ธฐ๋ฒ•์ด ๋ญ˜๊นŒ? ์–ด๋–ป๊ฒŒ ๋ณด๋Š” ๊ฑฐ์ง€?

๐Ÿ“– ๋“ค์–ด๊ฐ€๋ฉฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ณต๋ถ€ํ•˜๋Š” ๋ฐ์— ์žˆ์–ด์„œ ์ž๊พธ ๋น…์˜ค(Big O), ๋น…์˜ค(Big O) ๊ฑฐ๋ฆฌ๋Š”๋ฐ ๋„๋Œ€์ฒด ๋น…์˜ค(Big O)๊ฐ€ ๋ญ๊ณ  ์™œ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด์ง€ ๋ชฐ๋ผ์„œ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

1. ๋น…์˜ค(Big O) ํ‘œ๊ธฐ๋ฒ•์€ ์™œ ์‚ฌ์šฉํ•˜๋Š” ๊ฑฐ์ง€?

๋จผ์ € ๋น…์˜ค(Big O) ํ‘œ๊ธฐ๋ฒ•์„ ์™œ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ๊นŒ.

์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ•ด๊ฒฐ์— ์žˆ์–ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€์ธ ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋‹ค์ˆ˜์ด๋‹ค.

์ •์ˆ˜ n์„ ๋ฐ›์œผ๋ฉด 1๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋‘ ๊ฐ€์ง€์˜ ์ฝ”๋“œ๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด๊ฒ ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ

function addUpTo(n) {
  let total = 0;
  for (let i = 1; i <= n; i++) {
    total += i;
  }
  return total;
}

๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ

function addUpTo2(n) {
  return n * (n + 1) / 2;
}

์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•ด์„œ 1๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ์ˆซ์ž๋ฅผ ๋”ํ•ด์„œ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ณ ,

๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” ์ˆ˜ํ•™์ ์ธ ๊ณต์‹์„ ์ด์šฉํ•ด์„œ 1๋ถ€ํ„ฐ n๊นŒ์ง€ ์ˆซ์ž์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๋‘ ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋Š” ๊ฐ™๊ฒŒ ๋‚˜์˜จ๋‹ค.

ํ•˜์ง€๋งŒ ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ๋” ์ข‹๊ณ  ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ธ์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ž˜์„œ ์ด๊ฒƒ์„ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋น…์˜ค(Big O) ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋กœ ๋น„๊ตํ•˜๊ณ  ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•˜๊ณ  ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ๋น…์˜ค(Big O) ํ‘œ๊ธฐ๋ฒ•์ด๋ผ๊ณ  ํ•œ๋‹ค.

"์ข‹์€ ์ฝ”๋“œ", "๋‚˜์œ ์ฝ”๋“œ", "๊ทธ๋ƒฅ์ €๋ƒฅ์ธ ์ฝ”๋“œ"๋ฅผ ์ˆซ์ž๋กœ ์ฝ”๋“œ์˜ ์„ฑ๋Šฅ์„ ํ‘œ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๋ฐ˜์‘ํ˜•

2. ๊ทธ๋ž˜์„œ ๋น…์˜ค(Big O)๋Š”?

์ฆ‰, ์ž…๋ ฅ๊ฐ’๊ณผ ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์—์„œ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ฒ™๋„๋ฅผ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ผ๊ณ  ํ•˜๊ณ  ์ด๋ฅผ ๋น…์˜ค(Big O) ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ํ‘œ๊ธฐํ•œ๋‹ค. ๋ฌผ๋ก  ๊ณต๊ฐ„ ๋ณต์žก๋„์— ๋Œ€ํ•ด์„œ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

์ž…๋ ฅ๋œ ๊ฐ’์ด ์ปค์งˆ์ˆ˜๋ก ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹คํ–‰์‹œ๊ฐ„์ด ์–ด๋–ป๊ฒŒ ๋ณ€ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๋Š” ๊ณต์‹์ ์ธ ๋ฐฉ๋ฒ•.

์‹œ๊ฐ„ ๋ณต์žก๋„, ๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ‘œ๊ธฐํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ• ๋น…์˜ค(Big O)๋‹ค.

3. ๋น…์˜ค(Big O) ํ‘œ๊ธฐ๋ฒ•์€ ์–ด๋–ป๊ฒŒ ํ‘œ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑธ๊นŒ?

๋ณดํ†ต ์‚ฌ์šฉํ•˜๋Š” ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ๋Š”

O(1), O(log n), O(n), O(n^2), O(n log n), O(2^n) ๋“ฑ๋“ฑ ์žˆ๋‹ค.

๊ทธ๋Ÿผ ์ด ํ‘œ๊ธฐ๋ฒ•์€ ์–ด๋–ป๊ฒŒ ์•Œ๊ณ  ํ‘œ๊ธฐ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ.

๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค๋ฉด์„œ ์•Œ์•„๋ณด์ž.

3-1 O(1)

function addUpTo2(n) {
  return n * (n + 1) / 2;
}

์ž…๋ ฅ๊ฐ’ n์ด ์ปค์งˆ์ˆ˜๋ก ์•ฝ๊ฐ„์˜ ๋ณ€๋™์„ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ „๋ฐ˜์ ์ธ ์ฃผ์ œ์—๋Š” ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค.

10์œผ๋กœ ๊ณ„์‚ฐํ•˜๋˜์ง€ 10000์œผ๋กœ ๊ณ„์‚ฐํ•˜๋˜์ง€ ์—ฐ์‚ฐํ•˜๋Š” ์ˆ˜(์ฝ”๋“œ์—์„œ์˜ ๊ณฑ์…‰, ๋ง์…ˆ, ๋‚˜๋ˆ—์…ˆ)๋Š” ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—

O(1)๋กœ ํ‘œ๊ธฐํ•œ๋‹ค.

3-2 O(n)

function addUpTo(n) {
  let total = 0;
  for (let i = 1; i <= n; i++) {
    total += i;
  }
  return total;
}

๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž…๋ ฅ๊ฐ’ n์ด ์ปค์งˆ์ˆ˜๋ก ์—ฐ์‚ฐ์„ ํ•˜๋Š” ํšŸ์ˆ˜๋Š” n์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ์„œ ๋ณ€ํ•˜๊ฒŒ ๋œ๋‹ค.

๋ฐ˜๋ณต๋ฌธ์—์„œ ๋ณด๋ฉด i์™€ n์„ ๋น„๊ตํ•˜๊ณ , i๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ , ๋ณ€์ˆ˜ total์— ๋”ํ•ด์ฃผ๊ณ  ํ•˜๊ณ  ์žˆ๋Š”๋ฐ,

n์ด 10์ด๋ฉด ์ด ์—ฐ์‚ฐ๋“ค์„ 10๋ฒˆ ๋” ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๊ณ  10,000๋ฒˆ์ด๋ฉด ์ด ์—ฐ์‚ฐ๋“ค์„ 10,000๋ฒˆ ๋” ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋œ๋‹ค.

n์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ์„œ ์‹œ๊ฐ„์ด ๋‹ฌ๋ผ์ง€๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— O(n)์œผ๋กœ ํ‘œ๊ธฐํ•œ๋‹ค.

 

๋น…์˜ค(Big O)๋Š” ๋””ํ…Œ์ผํ•œ ๊ฒƒ์€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ๊ด‘๋ฒ”์œ„ํ•œ ๋ถ€๋ถ„๋งŒ ๋ณด๋ฉด ๋œ๋‹ค.

์ฆ‰, ๊ด‘๋ฒ”์œ„ํ•œ ์ถ”์„ธ๋งŒ ๋ณด๊ธฐ์—๋Š” ์ƒ์ˆ˜๋Š” ์ „ํ˜€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— O(10n) => O(n), O(300) => O(1), O(5n^2) => O(n^2) ๋“ฑ ์ด๋Ÿฐ ์‹์œผ๋กœ ํ‘œ๊ธฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

3-3 ๊ณ„์‚ฐ ๋ฐฉ๋ฒ•

๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด ์—ฐ์‚ฐ์ด ๋ช‡ ๋ฒˆ ์ˆ˜ํ–‰๋˜๋Š”์ง€, ์ž…๋ ฅ ๊ฐ’๊ณผ ์—ฐ์‚ฐ์˜ ๊ด€๊ณ„๊ฐ€ ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ๋ณด๋ฉด ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

4. ๋น…์˜ค(Big O) ํ‘œ๊ธฐ๋ฒ•์˜ ์ข…๋ฅ˜๋Š”?

O(1): ์ž…๋ ฅ๊ฐ’์ด ํฌ๊ธฐ์— ๋งŽ์€ ์ฐจ์ด๊ฐ€ ์žˆ์–ด๋„ ์ผ์ •ํ•œ ์‹คํ–‰์‹œ๊ฐ„์„ ๋ณด์—ฌ์ฃผ๋Š” ์ตœ๊ณ ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

O(log n): ๋กœ๊ทธ๋Š” ์ž…๋ ฅ๊ฐ’์ด ๋งค์šฐ ์ปค๋„ ํฌ๊ฒŒ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ํ•ด๋‹น๋œ๋‹ค.

O(n): ์ž…๋ ฅ๊ฐ’๊ณผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰์‹œ๊ฐ„์ด ๋น„๋ก€ํ•œ๋‹ค.

O(n log n): ๋ณ‘ํ•ฉ ์ •๋ ฌ ๊ฐ™์€ ํšจ์œจ์ด ์ข‹์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋Œ€๋ถ€๋ถ„ ์ด์— ํ•ด๋‹น๋œ๋‹ค.

O(n^2): ์ค‘์ฒฉ, ๋ฒ„๋ธ” ์ •๋ ฌ ๊ฐ™์€ ๋น„ ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

O(2^n): ํ”ผ๋ณด๋‚˜์น˜์˜ ์ˆ˜๋ฅผ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ณ„์‚ฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ํ•ด๋‹น๋œ๋‹ค.

O(n!): ๋งค์šฐ ๋Š๋ฆฌ๊ณ  ์ž…๋ ฅ๊ฐ’์ด ์ž‘์•„๋„ ๊ณ„์‚ฐ ์†๋„๊ฐ€ ๋งค์šฐ ์ฆ๊ฐ€ํ•œ๋‹ค.

์ž…๋ ฅ N๊ฐ’์— ๋”ฐ๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ๊ฐ„ ๋ณต์žก๋„

n๊ฐ’์— ๋”ฐ๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ ํ‘œ (์ถœ์ฒ˜: https://blog.chulgil.me/algorithm/)

 

๋น…์˜ค(Big O) ์„ฑ๋Šฅ ์‹œ๊ฐํ™” ์ž๋ฃŒ

๐Ÿ“•๋งˆ์น˜๋ฉฐ

๋น…์˜ค(Big O) ํ‘œ๊ธฐ๋ฒ•์ด ๋ฌด์—‡์ธ์ง€, ์–ด๋–ป๊ฒŒ ํ‘œ๊ธฐํ•˜๋Š” ๊ฑด์ง€ ๋“ฑ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•ด ๋ดค๋‹ค.

๋ฐ˜์‘ํ˜•