JavaScript๋กœ Google ์ธํ„ฐ๋ทฐ์—์„œ ๋ฌธ์ œ ํ•ด๊ฒฐ: 4๊ฐ€์ง€ ๋ฐฉ๋ฒ•

JavaScript๋กœ Google ์ธํ„ฐ๋ทฐ์—์„œ ๋ฌธ์ œ ํ•ด๊ฒฐ: 4๊ฐ€์ง€ ๋ฐฉ๋ฒ•

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ์„ ์—ฐ๊ตฌํ•˜๋˜ ์ค‘ ์ด๋Ÿฐ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๊ธ€ ๋ชจ์˜๋ฉด์ ‘ ์˜์ƒ์ž…๋‹ˆ๋‹ค.. ๋Œ€ํ˜• ๊ธฐ์ˆ  ๊ธฐ์—…์—์„œ ๋ฉด์ ‘์ด ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ์ตœ๋Œ€ํ•œ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

์ด ๊ธ€์€ ์˜์ƒ์— ๋Œ€ํ•œ ์ผ์ข…์˜ ๋ฐ˜์ฃผ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํ‘œ์‹œ๋œ ๋ชจ๋“  ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ JavaScript๋กœ ์ž‘์„ฑ๋œ ์†”๋ฃจ์…˜์˜ ์ž์ฒด ๋ฒ„์ „์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๋„ ๋…ผ์˜๋ฉ๋‹ˆ๋‹ค.

์•Œ๋ฆผ: "Habr"์˜ ๋ชจ๋“  ๋…์ž๋ฅผ ์œ„ํ•œ - "Habr" ํ”„๋กœ๋ชจ์…˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Skillbox ๊ณผ์ •์— ๋“ฑ๋กํ•  ๋•Œ 10 ๋ฃจ๋ธ” ํ• ์ธ.

Skillbox๋Š” ๋‹ค์Œ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์‹ค๊ธฐ ์ฝ”์Šค "๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœ์ž PRO".

๋ฌธ์ œ ์„ฑ๋ช…

์ˆœ์„œ๊ฐ€ ์ง€์ •๋œ ๋ฐฐ์—ด๊ณผ ํŠน์ • ๊ฐ’์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฐฐ์—ด์— ์žˆ๋Š” ๋‘ ์ˆซ์ž์˜ ํ•ฉ์ด ์ฃผ์–ด์ง„ ๊ฐ’๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ true ๋˜๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋ผ๋Š” ์š”์ฒญ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์ฆ‰, ๋ฐฐ์—ด์— ํ•จ๊ป˜ ๋”ํ•˜๋ฉด ์ง€์ •๋œ ๊ฐ’๊ณผ ๊ฐ™์€ ๋‘ ๊ฐœ์˜ ์ •์ˆ˜ x์™€ y๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ์‹œ A

๋ฐฐ์—ด [1, 2, 4, 9]๊ฐ€ ์ฃผ์–ด์ง€๊ณ  ๊ฐ’์ด 8์ธ ๊ฒฝ์šฐ ๋ฐฐ์—ด์— ์žˆ๋Š” ๋‘ ์ˆซ์ž์˜ ํ•ฉ์ด 8์ด ๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ B

๊ทธ๋Ÿฌ๋‚˜ ๋ฐฐ์—ด [1, 2, 4, 4]์ด๊ณ  ๊ฐ’์ด 8์ธ ๊ฒฝ์šฐ 4 + 4 = 8์ด๋ฏ€๋กœ ํ•จ์ˆ˜๋Š” true๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 1: ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…

์‹œ๊ฐ„ ๋ณต์žก๋„: O(Nยฒ).
๊ณต๊ฐ„ ๋ณต์žก๋„: O(1).

๊ฐ€์žฅ ๋ถ„๋ช…ํ•œ ์˜๋ฏธ๋Š” ํ•œ ์Œ์˜ ์ค‘์ฒฉ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

const findSum = (arr, val) => {
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr.length; j++) {
      if (i !== j && arr[i] + arr[j] === val) {
        return true;
      };
    };
  };
  return false;
};

์ด ์†”๋ฃจ์…˜์€ ๋ฐฐ์—ด์— ์žˆ๋Š” ๋‘ ์š”์†Œ์˜ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ•ฉ์„ ํ™•์ธํ•˜๊ณ  ๋ชจ๋“  ์ธ๋ฑ์Šค ์Œ์„ ๋‘ ๋ฒˆ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด i = 1์ด๊ณ  j = 2์ธ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ๋Š” i = 2 ๋ฐ j = 1๊ณผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜์ง€๋งŒ ์ด ์†”๋ฃจ์…˜์—์„œ๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์„ ๋ชจ๋‘ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.)

์šฐ๋ฆฌ ์†”๋ฃจ์…˜์€ ํ•œ ์Œ์˜ ์ค‘์ฒฉ for ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(Nยฒ) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” XNUMX์ฐจ์ž…๋‹ˆ๋‹ค.


์†”๋ฃจ์…˜ 2: ์ด์ง„ ๊ฒ€์ƒ‰

์‹œ๊ฐ„ ๋ณต์žก๋„: O(Nlog(N)).
๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
.

๋ฐฐ์—ด์ด ์ •๋ ฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ด์ง„ ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•˜์—ฌ ์†”๋ฃจ์…˜์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ •๋ ฌ๋œ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ์ด์ง„ ๊ฒ€์ƒ‰ ์ž์ฒด์˜ ์‹คํ–‰ ์‹œ๊ฐ„์€ O(log(N))์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ ์š”์†Œ๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฐ’๊ณผ ๋น„๊ตํ•˜๋ ค๋ฉด for ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ด์ง„ ๊ฒ€์ƒ‰์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฃผ์–ด์ง„ ์ธ๋ฑ์Šค๋ฅผ ๋บ€ ๋ฐฐ์—ด ๋ฒ„์ „์„ ๋ฐ˜ํ™˜ํ•˜๋Š” RemoveIndex() ํ•จ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

const findSum = (arr, val) => {
  for (let i = 0; i < arr.length; i++){
    if (binarySearch(removeIndex(arr, i), val - arr[i])) {
      return true;
    }
  };
  return false;
};
 
const removeIndex = (arr, i) => {
  return arr.slice(0, i).concat(arr.slice(i + 1, arr.length));
};
 
const binarySearch = (arr, val) => {
  let start = 0;
  let end = arr.length - 1;
  let pivot = Math.floor(arr.length / 2); 
  while (start < end) {
    if (val < arr[pivot]) {
      end = pivot - 1;
    } else if (val > arr[pivot]) {
      start = pivot + 1;
    };
    pivot = Math.floor((start + end) / 2);
    if (arr[pivot] === val) {
      return true;
    }
  };
  return false;
};

์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ธ๋ฑ์Šค [0]๋ถ€ํ„ฐ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ ์ œ์™ธํ•œ ๋ฐฐ์—ด ๋ฒ„์ „์„ ์ƒ์„ฑํ•˜๊ณ  ์ด์ง„ ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚˜๋จธ์ง€ ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•˜์—ฌ ์›ํ•˜๋Š” ํ•ฉ๊ณ„๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ์”ฉ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

for ๋ฃจํ”„ ์ž์ฒด๋Š” O(N)์˜ ์„ ํ˜• ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–์ง€๋งŒ for ๋ฃจํ”„ ๋‚ด๋ถ€์—์„œ๋Š” ์ด์ง„ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(Nlog(N))์ž…๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜์€ ์ด์ „ ์†”๋ฃจ์…˜๋ณด๋‹ค ์šฐ์ˆ˜ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ฐœ์„ ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 3: ์„ ํ˜• ์‹œ๊ฐ„

์‹œ๊ฐ„ ๋ณต์žก๋„: O(N).
๊ณต๊ฐ„ ๋ณต์žก๋„: O(1).

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

๊ฒฐ๊ตญ ์›ํ•˜๋Š” ๊ฐ’์„ ๋งŒ๋‚˜ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, ์‹œ์ž‘์ ๊ณผ ๋์ ์ด ์ˆ˜๋ ดํ•˜์—ฌ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

const findSum = (arr, val) => {
  let start = 0;
  let end = arr.length - 1;
  while (start < end) {
    let sum = arr[start] + arr[end];
    if (sum > val) {
      end -= 1;
    } else if (sum < val) {
      start += 1;
    } else {
      return true;
    };
  };
  return false;
};


์ด์ œ ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ด๋ฉฐ ์†”๋ฃจ์…˜์ด ์ตœ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋ ˆ์ด๊ฐ€ ์ฃผ๋ฌธ๋˜์—ˆ๋Š”์ง€ ๋ˆ„๊ฐ€ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ ๋•Œ ๋ฌด์—‡?

์–ผํ• ๋ณด๋ฉด ๋‹จ์ˆœํžˆ ์–ด๋ ˆ์ด๋ฅผ ๋จผ์ € ์ฃผ๋ฌธํ•œ ๋‹ค์Œ ์œ„์˜ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์‹คํ–‰ ์‹œ๊ฐ„์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น ๊นŒ์š”?

๊ฐ€์žฅ ์ข‹์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(Nlog(N))์ธ ํ€ต ์ •๋ ฌ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์ตœ์ ์˜ ์†”๋ฃจ์…˜์— ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ด O(N)์—์„œ O(Nlog(N))์œผ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ฐฐ์—ด๋กœ ์„ ํ˜• ์†”๋ฃจ์…˜์„ ์ฐพ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

4 ์†”๋ฃจ์…˜

์‹œ๊ฐ„ ๋ณต์žก๋„: O(N).
๊ณต๊ฐ„ ๋ณต์žก๋„: O(N).

์˜ˆ, ์„ ํ˜• ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ฐพ๊ณ  ์žˆ๋Š” ์ผ์น˜ ํ•ญ๋ชฉ ๋ชฉ๋ก์ด ํฌํ•จ๋œ ์ƒˆ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ์˜ ์ ˆ์ถฉ์ ์€ ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋…ผ๋ฌธ์—์„œ ๊ณต๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(1)๋ณด๋‹ค ํฐ ์œ ์ผํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์ด 1์ด๊ณ  ๊ฒ€์ƒ‰ ๊ฐ’์ด 8์ธ ๊ฒฝ์šฐ "๊ฒ€์ƒ‰ ๊ฐ’" ๋ฐฐ์—ด์— ๊ฐ’ 7์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ "๊ฒ€์ƒ‰ ๊ฐ’" ๋ฐฐ์—ด์„ ํ™•์ธํ•˜๊ณ  ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์šฐ๋ฆฌ ๊ฐ’๊ณผ ๊ฐ™์€์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

const findSum = (arr, val) => {
  let searchValues = [val - arr[0]];
  for (let i = 1; i < arr.length; i++) {
    let searchVal = val - arr[i];
    if (searchValues.includes(arr[i])) {
      return true;
    } else {
      searchValues.push(searchVal);
    }
  };
  return false;
};

์†”๋ฃจ์…˜์˜ ๊ธฐ๋ณธ์€ ์œ„์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ O(N)์˜ ์„ ํ˜• ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” for ๋ฃจํ”„์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜์˜ ๋‘ ๋ฒˆ์งธ ๋ฐ˜๋ณต ๋ถ€๋ถ„์€ ๋ฐฐ์—ด์— ์ง€์ •๋œ ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ true ๋˜๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” JavaScript ๋ฉ”์„œ๋“œ์ธ Array.prototype.include()์ž…๋‹ˆ๋‹ค.

Array.prototype.includes()์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด MDN์—์„œ ์ œ๊ณตํ•˜๊ณ  JavaScript๋กœ ์ž‘์„ฑ๋œ ํด๋ฆฌํ•„์„ ๋ณด๊ฑฐ๋‚˜ Google V8(C++)๊ณผ ๊ฐ™์€ JavaScript ์—”์ง„์˜ ์†Œ์Šค ์ฝ”๋“œ์— ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// https://tc39.github.io/ecma262/#sec-array.prototype.includes
if (!Array.prototype.includes) {
  Object.defineProperty(Array.prototype, 'includes', {
    value: function(valueToFind, fromIndex) {
 
      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }
 
      // 1. Let O be ? ToObject(this value).
      var o = Object(this);
 
      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;
 
      // 3. If len is 0, return false.
      if (len === 0) {
        return false;
      }
 
      // 4. Let n be ? ToInteger(fromIndex).
      //    (If fromIndex is undefined, this step produces the value 0.)
      var n = fromIndex | 0;
 
      // 5. If n โ‰ฅ 0, then
      //  a. Let k be n.
      // 6. Else n < 0,
      //  a. Let k be len + n.
      //  b. If k < 0, let k be 0.
      var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
 
      function sameValueZero(x, y) {
        return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));
      }
 
      // 7. Repeat, while k < len
      while (k < len) {
        // a. Let elementK be the result of ? Get(O, ! ToString(k)).
        // b. If SameValueZero(valueToFind, elementK) is true, return true.
        if (sameValueZero(o[k], valueToFind)) {
          return true;
        }
        // c. Increase k by 1.
        k++;
      }
 
      // 8. Return false
      return false;
    }
  });
}

์—ฌ๊ธฐ์„œ Array.prototype.include()์˜ ๋ฐ˜๋ณต ๋ถ€๋ถ„์€ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ ์ „์ฒด ๊ธธ์ด๋ฅผ (๊ฑฐ์˜) ์ˆœํšŒํ•˜๋Š” 7๋‹จ๊ณ„์˜ while ๋ฃจํ”„์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„๋„ ์„ ํ˜•์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์Œ, ํ•ญ์ƒ ๋ฉ”์ธ ๋ฐฐ์—ด๋ณด๋‹ค ํ•œ ๋‹จ๊ณ„ ๋’ค์ฒ˜์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N + (N - 1))์ž…๋‹ˆ๋‹ค. Big O ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ O(N)์œผ๋กœ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆด ๋•Œ ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์€ N์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ณต๊ฐ„ ๋ณต์žก์„ฑ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ธธ์ด๊ฐ€ ์›๋ž˜ ๋ฐฐ์—ด์„ ๋ฐ˜์˜ํ•˜๋Š” ์ถ”๊ฐ€ ๋ฐฐ์—ด์ด ํ•„์š”ํ•˜๋ฏ€๋กœ(XNUMX ๋นผ๊ธฐ, ์˜ˆ, ๊ทธ๋Ÿฌ๋‚˜ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Œ) O(N) ๊ณต๊ฐ„ ๋ณต์žก์„ฑ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์Œ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋Š˜์–ด๋‚˜๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํšจ์œจ์„ฑ์ด ๊ทน๋Œ€ํ™”๋ฉ๋‹ˆ๋‹ค.


์ด ๊ธฐ์‚ฌ๊ฐ€ ๋น„๋””์˜ค ์ธํ„ฐ๋ทฐ์˜ ๋ณด์ถฉ์ž๋ฃŒ๋กœ ์œ ์šฉํ•˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ๊ฐ€ ๋‹ค์–‘ํ•œ ์–‘์˜ ๋ฆฌ์†Œ์Šค(์‹œ๊ฐ„, ๋ฉ”๋ชจ๋ฆฌ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

Skillbox๋Š” ๋‹ค์Œ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€