[TIL] 211020

Lee Syongยท2021๋…„ 10์›” 20์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
63/204
post-thumbnail

๐Ÿ“ ์˜ค๋Š˜ ํ•œ ๊ฒƒ

  1. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ ํ’€์ด - ๋ฌธ์ž์—ด ๋‚ด p์™€ y์˜ ๊ฐœ์ˆ˜ / ํ•ธ๋“œํฐ ๋ฒˆํ˜ธ ๊ฐ€๋ฆฌ๊ธฐ / ๋ฌธ์ž์—ด ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๋ฐฐ์น˜ํ•˜๊ธฐ / ์ž๋ฆฟ์ˆ˜ ๋”ํ•˜๊ธฐ / ๋‘ ๊ฐœ ๋ฝ‘์•„์„œ ๋”ํ•˜๊ธฐ

  2. ์žฌ๊ท€ ํ•จ์ˆ˜ / ๊ธฐ์ € ์กฐ๊ฑด / ๋ถ„ํ•  / ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜


๐Ÿ“– ํ•™์Šต ์ž๋ฃŒ

  1. ์ฑ… '๋ˆ„๊ตฌ๋‚˜ ์ž๋ฃŒ ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜'

๐Ÿ“š ๋ฐฐ์šด ๊ฒƒ

1. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ ํ’€์ด

1) Level 1 ๋ฌธ์ œ ํ’€์ด

(1) ๋ฌธ์ž์—ด ๋‚ด p์™€ y์˜ ๊ฐœ์ˆ˜

๐Ÿ”Ž ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ํ’€์ด

function solution(s){
  let pCount = 0;
  let yCount = 0;

  for (let i = 0; i < s.length; i++) {
    if (s[i] === 'p' || s[i] === 'P') {
      pCount++;
    }
    if (s[i] === 'y' || s[i] === 'Y') {
      yCount++;
    }
  }

  if (pCount === yCount) {
    return true;
  } else if (pCount !== yCount) {
    return false;
  }
}

(2) ํ•ธ๋“œํฐ ๋ฒˆํ˜ธ ๊ฐ€๋ฆฌ๊ธฐ

๐Ÿ”Ž ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ํ’€์ด

function solution(phone_number) {
  const arr = phone_number.split('');
  let arr_length = arr.length - 1;

  const hide = arr.map(num => num = '*');

  for (let i = hide.length - 1; i >= hide.length - 4; i--) {
    hide[i] = phone_number[arr_length];
    arr_length--;
  }

  return hide.join('');
}

๐Ÿ”Ž ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

  • repeat()์™€ slice() ํ™œ์šฉ
function solution(num) {
  return '*'.repeat(num.length - 4) + num.slice(-4);
}

(3) ๋ฌธ์ž์—ด ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๋ฐฐ์น˜ํ•˜๊ธฐ

๐Ÿ”Ž ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ํ’€์ด

  • ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์— sort()๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ๊ธฐ๋ณธ์ ์œผ๋กœ (๋Œ€๋ฌธ์ž ์˜ค๋ฆ„์ฐจ์ˆœ + ์†Œ๋ฌธ์ž ์˜ค๋ฆ„์ฐจ์ˆœ) ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ๋‹ค.
// ์˜ˆ์ œ
const string = 'cAdaCbfB';
console.log(string.split('').sort()); // ABCabcdf
  • ๋ฆฌํ„ดํ•ด์•ผ ํ•  ๊ฐ’์€ (์†Œ๋ฌธ์ž ๋‚ด๋ฆผ์ฐจ์ˆœ + ๋Œ€๋ฌธ์ž ๋‚ด๋ฆผ์ฐจ์ˆœ) ์ด๋‹ค.

  • sort()์— ๋”ฐ๋ผ ๊ธฐ๋ณธ์ ์ธ ์ˆœ์„œ๋กœ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ slice()๋ฅผ ์ด์šฉํ•ด ๋Œ€๋ฌธ์ž์™€ ์†Œ๋ฌธ์ž๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ๊ฐ์˜ ๋ฐฐ์—ด์— reverse()๋ฅผ ์‹คํ–‰ํ•ด ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ–ˆ๋‹ค. ๊ทธ ํ›„ concat()์„ ์ด์šฉํ•ด ํ•ฉ์นœ ๋ฐฐ์—ด์„ ์ตœ์ข…์ ์œผ๋กœ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ–ˆ๋‹ค.

function solution(s) {
  const arr = s.split('').sort();

  let lowercases;
  let uppercases;

  for (let i = 0; i < arr.length; i++) {
    if (arr[i] !== arr[i].toUpperCase()) {
      lowercases = arr.slice(i);
      uppercases = arr.slice(0, i);
      break;
    }
  }

  const lowerReverse = lowercases.reverse();
  const upperReverse = uppercases.reverse();

  return lowerReverse.concat(upperReverse).join('');
}

๐Ÿ”Ž ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

  • ์•„๋‹ˆ ๋‚˜ ๋ญํ•œ ๊ฑฐ์ง€?...
function solution(s) {
  return s
    .split("")
    .sort()
    .reverse()
    .join("");
}

(4) ์ž๋ฆฟ์ˆ˜ ๋”ํ•˜๊ธฐ

๐Ÿ”Ž ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ํ’€์ด

function solution(n) {
  return (n + '').split('')
    .map(item => parseInt(item))
    .reduce((prev, curr) => prev + curr);
}

๐Ÿ”Ž ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

  • do while ๋ฌธ ์ด์šฉ
function solution(n) {
  let sum = 0;
  
  do {
    sum += n % 10;
    n = Math.floor(n / 10);
  } while (n > 0);
  
  return sum;
}

(5) ๋‘ ๊ฐœ ๋ฝ‘์•„์„œ ๋”ํ•˜๊ธฐ

๐Ÿ”Ž ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ํ’€์ด

function solution(numbers) {
  const arr = [];
  for (let i = 0; i < numbers.length - 1; i++) {
    for (let j = i + 1; j < numbers.length; j++) {
      const sum = numbers[i] + numbers[j];
      if (arr[sum] === undefined) {
        arr[sum] = sum;
      }
    }
  }
  return arr.flat();
}

9์žฅ. ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•œ ์žฌ๊ท€์  ๋ฐ˜๋ณต

๐Ÿ“Œ ์žฌ๊ท€ ํ•จ์ˆ˜๋ž€, ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค

1) ๋ฃจํ”„ ๋Œ€์‹  ์žฌ๊ท€

(1) 10์—์„œ 0๊นŒ์ง€ ์ˆซ์ž๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•

p.173

  • ๋ฐฉ๋ฒ• 1

for ๋ฃจํ”„ ์ด์šฉ

function count(num) {
  for (let i = num; i >= 0; i--) {
    console.log(i);
  }
}

count(10);
  • ๋ฐฉ๋ฒ• 2

์žฌ๊ท€ ํ•จ์ˆ˜ ์ด์šฉ (๋‹ต ์•„๋‹˜)

function count(num) {
  console.log(num);
  count(num - 1);
}

count(10); // 10๋ถ€ํ„ฐ 1์”ฉ ์ž‘์•„์ง„ ์ˆซ์ž๊ฐ€ ๋ฌดํ•œ์œผ๋กœ console ์ฐฝ์— ์ถœ๋ ฅ๋˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ

(2) ๊ธฐ์ € ์กฐ๊ฑด

  • ์žฌ๊ท€๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”(๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜๋ณต๋˜์ง€ ์•Š๋Š”) ๊ฒฝ์šฐ๋ฅผ ๊ธฐ์ € ์กฐ๊ฑด(์ค‘๋‹จ ์กฐ๊ฑด)์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • ์œ„ ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ, ์นด์šดํŠธ๋ฅผ 0์—์„œ ๋๋‚ด๊ณ  ์žฌ๊ท€๊ฐ€ ์˜์›ํžˆ ์ง€์†๋˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์•ผ ํ•œ๋‹ค

  • ๋”ฐ๋ผ์„œ, if ๋ฌธ์„ ์ถ”๊ฐ€ํ•ด num 0์ด ๋˜๋ฉด ํ•จ์ˆ˜๋ฅผ ๋๋‚ด๋„๋ก ํ•œ๋‹ค. ์ด๋•Œ 0์ด ๊ธฐ์ € ์กฐ๊ฑด์— ํ•ด๋‹นํ•œ๋‹ค.

function count(num) {
  console.log(num);
  if (num === 0) { // ์ถ”๊ฐ€!
    return;
  } else {
    count(num - 1);
  }
}

count(10);

2) ์žฌ๊ท€ ์ฝ”๋“œ ์ฝ๊ธฐ

[์˜ˆ์ œ]

์ฃผ์–ด์ง„ ์ˆ˜์˜ ๊ณ„์Šน์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ผ.
cf. ๊ณ„์Šน์ด๋ž€? ๊ทธ ์ˆ˜๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๋ชจ๋“  ์–‘์˜ ์ •์ˆ˜์˜ ๊ณฑ์„ ๋งํ•œ๋‹ค.

p.176
Ruby๋กœ ๊ตฌํ˜„๋œ ์ฝ”๋“œ โ†’ JavaScript๋กœ ๋ณ€ํ™˜

function factorial(num) {
  if (num === 1) { // ์žฌ๊ท€๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์ด๋‹ค โ†’ ๊ธฐ์ € ์กฐ๊ฑด
    return 1;
  } else { // ์žฌ๊ท€๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค
    return num * factorial(num - 1);
  }
}

console.log(factorial(3)); // 6 (3*2*1)

(1) ์žฌ๊ท€ ์ฝ”๋“œ ์ถ”๋ก  ์ˆœ์„œ (by ์‚ฌ๋žŒ)

  1. ๊ธฐ์ € ์กฐ๊ฑด(์žฌ๊ท€๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ)์ด ๋ฌด์—‡์ธ์ง€ ์ฐพ๋Š”๋‹ค.

num์ด 1์ผ ๊ฒฝ์šฐ๊ฐ€ ๊ธฐ์ € ์กฐ๊ฑด์ด๋‹ค.

if (num === 1) {
  return 1;
}
  1. ๊ธฐ์ € ์กฐ๊ฑด์„ ๋‹ค๋ฃฌ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ณธ๋‹ค.

factorical(1)์„ ์‚ดํŽด๋ณธ๋‹ค. factorial(1)์„ ํ˜ธ์ถœํ•˜๋ฉด 1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
์ผ๋‹จ ์ด ์‚ฌ์‹ค์„ ๊ธฐ์–ตํ•ด๋ผ.

  1. ๊ธฐ์ € ์กฐ๊ฑด์˜ ๋ฐ”๋กœ '์ „' ์กฐ๊ฑด์„ ๋‹ค๋ฃฌ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ณธ๋‹ค.

num์€ 1์ด ๋˜๊ธฐ '์ „'์— 2์˜€์„ ๊ฒƒ์ด๋ฏ€๋กœ factorial(2)๋ฅผ ์‚ดํŽด๋ณธ๋‹ค.
factorial(2)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด 2 * factorial(1)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
2.์— ๋”ฐ๋ฅด๋ฉด factorial(1)์€ ๊ณง 1์ด๋ฏ€๋กœ ๊ฒฐ๊ตญ factorial(2)๋Š” 2๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด ์‚ฌ์‹ค์„ ๊ธฐ์–ตํ•ด๋ผ.

  1. ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•œ ๋ฒˆ์— ํ•œ ์กฐ๊ฑด์”ฉ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ๊ณ„์† ๋ถ„์„ํ•œ๋‹ค.

(2) ์žฌ๊ท€ ํ•จ์ˆ˜ ๋™์ž‘ ์›๋ฆฌ (by ์ปดํ“จํ„ฐ)

์ปดํ“จํ„ฐ๋Š” ํ˜ธ์ถœ ์Šคํƒ(Call Stack)์„ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ์ค‘์ธ์ง€ ๊ธฐ๋กํ•œ๋‹ค.

  1. factorial(3)์ด ํ˜ธ์ถœ๋œ๋‹ค.
    ํ˜ธ์ถœ ์Šคํƒ์— factorial(3)์„ pushํ•œ๋‹ค.

  2. factorial(3)์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์—,
    factorial(3) ์‹คํ–‰ ์ค‘, factorial(2)๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
    ํ˜ธ์ถœ ์Šคํƒ์— factorial(2)๋ฅผ pushํ•œ๋‹ค.

  3. factorial(2)์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์—,
    factorial(2) ์‹คํ–‰ ์ค‘, factorial(1)์ด ํ˜ธ์ถœ๋œ๋‹ค.
    ํ˜ธ์ถœ ์Šคํƒ์— factorial(1)์„ pushํ•œ๋‹ค.

  4. 1์ด ๊ธฐ์ € ์กฐ๊ฑด์ด๋ฏ€๋กœ factorial(1)์€ factorial() ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  1์„ ๋ฆฌํ„ดํ•˜๋ฉฐ ์‹คํ–‰์ด ์™„๋ฃŒ๋œ๋‹ค.
    ํ˜ธ์ถœ ์Šคํƒ์—์„œ factorial(1)์„ popํ•œ๋‹ค.

  5. ํ˜ธ์ถœ ์Šคํƒ์—๋Š” ์•„์ง ์ฑ„ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์€ factorial(2)์™€ factorial(3)์ด ๋“ค์–ด ์žˆ๋‹ค.
    ์ด ์ค‘์—์„œ ํ˜ธ์ถœ ์Šคํƒ์— ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— push๋œ ๊ฒƒ์€ factorial(2)์ด๋‹ค.
    ๋”ฐ๋ผ์„œ, factorial(2)๊ฐ€ (factorial(1)์˜ ๊ฒฐ๊ณผ๋ฅผ ํ† ๋Œ€๋กœ) ์‹คํ–‰์ด ์™„๋ฃŒ๋œ๋‹ค.
    ํ˜ธ์ถœ ์Šคํƒ์—์„œ factorial(2)์„ popํ•œ๋‹ค.

  6. ์ด์–ด์„œ factorial(3)๊ฐ€ (factorial(2)์˜ ๊ฒฐ๊ณผ๋ฅผ ํ† ๋Œ€๋กœ) ์‹คํ–‰์ด ์™„๋ฃŒ๋œ๋‹ค.
    ํ˜ธ์ถœ ์Šคํƒ์—์„œ factorial(3)์„ popํ•œ๋‹ค.

  7. ์ด์ œ ํ˜ธ์ถœ ์Šคํƒ์€ ๋น„์–ด ์žˆ์œผ๋ฏ€๋กœ ์ปดํ“จํ„ฐ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ์‹คํ–‰ํ–ˆ์Œ์„ ์•Œ๊ฒŒ ๋˜๊ณ , ์žฌ๊ท€๋Š” ๋๋‚˜๊ฒŒ ๋œ๋‹ค.


3) ์žฌ๊ท€ ๋‹ค๋ค„๋ณด๊ธฐ

  • ์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‚ด์—์„œ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

[์˜ˆ์ œ]

์ฃผ์–ด์ง„ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๋ชจ๋“  ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ช…์„ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ผ.

pp.182 ~ 184
Ruby๋กœ ๊ตฌํ˜„๋œ ์ฝ”๋“œ โ†’ JavaScript๋กœ ๋ณ€ํ™˜

๐Ÿ™‹โ€โ™€๏ธ Q1. Ruby๋ฅผ ์ „ํ˜€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๊ธ€๋กœ ๋œ ์„ค๋ช…๋งŒ ๋ณด๊ณ  ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”๋ฐ ํ•œ๊ธ€์„ ์ฝ์–ด๋„ ์ฝ”๋“œ๋กœ ๋ชป ๋ฐ”๊พธ๊ฒ ๋‹ค. node.js๋ฅผ ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฑด์ง€ ๊ทธ๋ƒฅ ๋‚ด๊ฐ€ ์ดํ•ด๋ฅผ ๋ชปํ•˜๋Š” ๊ฑด์ง€.


10์žฅ. ์†๋„๋ฅผ ๋†’์ด๋Š” ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๐Ÿ“Œ ํ€ต ์ •๋ ฌ์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ๊ณต๋ถ€ํ•จ์œผ๋กœ์จ ์–ด๋–ป๊ฒŒ ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฐฐ์šฐ๊ณ ์ž ํ•œ๋‹ค

๐Ÿ“Œ ๋งŽ์€ ์ปดํ“จํ„ฐ ์–ธ์–ด์—๋Š” ์ด๋ฏธ ํ€ต ์ •๋ ฌ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค

๐Ÿ“Œ ํ€ต ์ •๋ ฌ์€ ์ตœ์•…์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์‚ฝ์ž… ์ •๋ ฌ, ์„ ํƒ ์ •๋ ฌ๊ณผ ์„ฑ๋Šฅ์ด ์œ ์‚ฌํ•˜์ง€๋งŒ, ํ‰๊ท  ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ํ›จ์”ฌ ๋น ๋ฅด๋‹ค.

๐Ÿ“Œ ํ€ต ์ •๋ ฌ์€ ๋ถ„ํ• ์ด๋ผ๋Š” ๊ฐœ๋…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค.

1) ๋ถ„ํ• 

(1) ์„ค๋ช…

  • ๋ฐฐ์—ด์„ ๋ถ„ํ• ํ•œ๋‹ค๋Š” ๊ฒƒ์€,

    ๋ฐฐ์—ด๋กœ๋ถ€ํ„ฐ ์ž„์˜์˜ ์ˆ˜(ํ”ผ๋ฒ—)์„ ๊ฐ€์ ธ์™€
    ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ชจ๋“  ์ˆ˜๋Š” ํ”ผ๋ฒ—์˜ ์™ผ์ชฝ์—
    ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ชจ๋“  ์ˆ˜๋Š” ํ”ผ๋ฒ—์˜ ์˜ค๋ฅธ์ชฝ์— ๋‘๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

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

(2) ์ฝ”๋“œ ๊ตฌํ˜„

๋ฐฐ์—ด ๋ถ„ํ•  ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” class ๊ตฌํ˜„ํ•˜๊ธฐ

  • ๋ฐฐ์—ด ๋ถ„ํ•  ๋ฉ”์„œ๋“œ๋Š” '์™ผ์ชฝ ํฌ์ธํ„ฐ์™€ ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ์˜ ์‹œ์ž‘์ '์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.

  • ํ€ต ์ •๋ ฌ ๋ฉ”์„œ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด, ๋ฐฐ์—ด ๋ถ„ํ•  ๋ฉ”์„œ๋“œ๋Š”, ์ตœ์ข…์ ์œผ๋กœ '์™ผ์ชฝ ํฌ์ธํ„ฐ๊ฐ€ ์ด๋™์„ ๋ฉˆ์ท„์„ ๋•Œ์˜ ์œ„์น˜(์ฆ‰, ํ”ผ๋ฒ—์ด ๋“ค์–ด๊ฐ„ ์ตœ์ข… ์œ„์น˜)'๋ฅผ ๋ฆฌํ„ดํ•˜๋„๋ก ํ•œ๋‹ค.

p.193
Ruby๋กœ ๊ตฌํ˜„๋œ ์ฝ”๋“œ โ†’ JavaScript๋กœ ๋ณ€ํ™˜

class SortableArray {
  constructor(arr) {
    this.arr = arr;
  }

  partition(left_pointer, right_pointer) {
    // ํ•ญ์ƒ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๊ฐ’์„ ํ”ผ๋ฒ—์œผ๋กœ ์„ค์ •ํ•œ๋‹ค (์ด ์˜ˆ์ œ์˜ ์กฐ๊ฑด์ผ ๋ฟ, ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ์œ„์น˜๋ฅผ ๊ณ ๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค)
    const pivot = this.arr[right_pointer];
    const pivot_position = right_pointer;

    let left = left_pointer;
    let right = right_pointer - 1;

    while (true) {
      while (this.arr[left] < pivot) {
        left += 1;
      }
      while (left < right && this.arr[right] > pivot) {
        right -= 1;
      }

      if (left >= right) {
        // ์™ผ์ชฝ ํฌ์ธํ„ฐ์™€ ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ์˜ ์œ„์น˜๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜
        // ์™ผ์ชฝ ํฌ์ธํ„ฐ๊ฐ€ ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ์— ์žˆ๊ฒŒ ๋˜๋ฉด
        // ๋ฐ”๊นฅ while ๋ฃจํ”„๋ฅผ ๋น ์ ธ๋‚˜๊ฐ„ ํ›„
        break;
      } else {
        this.swap(left, right);
        left += 1;
      }
    }

    // ํ˜„์žฌ ์™ผ์ชฝ ํฌ์ธํ„ฐ์™€ ํ˜„์žฌ ํ”ผ๋ฒ— ์œ„์น˜๋ฅผ ๊ตํ™˜ํ•œ๋‹ค
    this.swap(left, pivot_position);

    return left;
  }

  swap(pointer_1, pointer_2) {
    const temp = this.arr[pointer_1];
    this.arr[pointer_1] = this.arr[pointer_2];
    this.arr[pointer_2] = temp;
  }
}

const arr1 = [0, 5, 2, 1, 6, 3];
const arr = new SortableArray(arr1);
console.log(arr.partition(0, arr1.length - 1)); // 3
console.log(arr1); // [0, 1, 2, 3, 6, 5]

2) ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

(1) ์„ค๋ช…

  • ์•ž์„œ ๋ฐฐ์—ด์„ ๋ถ„ํ• ํ–ˆ๋‹ค. ์ด์ œ ํ”ผ๋ฒ—(3)์€ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ์žˆ๋‹ค.

  • ๋‹ค์Œ์œผ๋กœ ํ”ผ๋ฒ—(3)์˜ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ํ•˜์œ„ ๋ฐฐ์—ด์„ ๊ฐ๊ฐ ๋˜ ๋‹ค๋ฅธ ๋ฐฐ์—ด๋กœ ๋ณด๊ณ , ์ด๋ฅผ ๋‹ค์‹œ ๋ถ„ํ• ํ•˜๋„๋ก ํ•œ๋‹ค. ์ด์ œ๋Š” ๋‘ ๋ฒˆ์งธ ๋ถ„ํ•  ์‹œ ์‚ฌ์šฉ๋œ ํ”ผ๋ฒ— ๋˜ํ•œ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ์žˆ๊ฒŒ ๋œ๋‹ค.

  • ๋™์ผํ•œ ๊ณผ์ •์„ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐ˜๋ณตํ•˜๋˜, ๊ธฐ์ € ์กฐ๊ฑด์„ ๋งจ ์ฒ˜์Œ์— ์ ์–ด์ค€๋‹ค.

(2) ์ฝ”๋“œ ๊ตฌํ˜„

์œ„ ์˜ˆ์ œ์—์„œ ํ€ต ์ •๋ ฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค

class SortableArray {
  constructor(arr) {
    this.arr = arr;
  }

  // ํ€ต ์ •๋ ฌ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ โ—
  quickSort(left_index, right_index) {
    // ๋” ์ด์ƒ ์žฌ๊ท€๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ์ฆ‰, ๋ถ„ํ•  ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜๋ณต๋˜์ง€ ์•Š๋Š”
    // ๊ธฐ์ € ์กฐ๊ฑด : ํ•˜์œ„ ๋ฐฐ์—ด์— ์›์†Œ๊ฐ€ 0๊ฐœ ๋˜๋Š” 1๊ฐœ์ผ ๋•Œ
    if (left_index >= right_index) {
      return;
    }

    // ์ฒ˜์Œ์œผ๋กœ ๋ฐฐ์—ด์„ ๋ถ„ํ• ํ•˜๊ณ , ํ”ผ๋ฒ—์˜ ์œ„์น˜๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค
    const pivot_position = this.partition(left_index, right_index);

    // ํ”ผ๋ฒ— ์™ผ์ชฝ์— ๋Œ€ํ•ด ๋ถ„ํ•  ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค
    this.quickSort(left_index, pivot_position - 1);
    // ํ”ผ๋ฒ— ์˜ค๋ฅธ์ชฝ์— ๋Œ€ํ•ด ๋ถ„ํ•  ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค
    this.quickSort(pivot_position + 1, right_index);
  }

  // ๋ถ„ํ•  ๋ฉ”์„œ๋“œ
  partition(left_pointer, right_pointer) {
    const pivot = this.arr[right_pointer];
    const pivot_position = right_pointer;

    let left = left_pointer;
    let right = right_pointer - 1;

    while (true) {
      while (this.arr[left] < pivot) {
        left += 1;
      }
      while (left < right && this.arr[right] > pivot) {
        right -= 1;
      }

      if (left >= right) {
        break;
      } else {
        this.swap(left, right);
        left += 1;
      }
    }

    this.swap(left, pivot_position);

    return left;
  }

  // ๋ฐฐ์—ด ์š”์†Œ ๊ตํ™˜ ๋ฉ”์„œ๋“œ
  swap(pointer_1, pointer_2) {
    const temp = this.arr[pointer_1];
    this.arr[pointer_1] = this.arr[pointer_2];
    this.arr[pointer_2] = temp;
  }
}

const arr1 = [0, 5, 2, 1, 6, 3];
const arr = new SortableArray(arr1);
arr.quickSort(0, arr1.length - 1);
console.log(arr1); // [0, 1, 2, 3, 5, 6]

(3) ๋น… ์˜ค

๐Ÿ”Ž ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํšจ์œจ์„ฑ์„ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๋จผ์ € ๋ถ„ํ• ์˜ ํšจ์œจ์„ฑ์„ ๋ฐํ˜€์•ผ ํ•œ๋‹ค

๋ถ„ํ• ์—๋Š” ์ด ๋‘ ์ข…๋ฅ˜์˜ ๋‹จ๊ณ„, ๋น„๊ต & ๊ตํ™˜์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

  • ๋น„๊ต

    ๊ฐ ๋ถ„ํ• ๋งˆ๋‹ค, ๋ฐ์ดํ„ฐ๊ฐ€ N๊ฐœ์ผ ๋•Œ, '๋น„๊ต'๋Š” N๋ฒˆ ์ผ์–ด๋‚œ๋‹ค.
    ๋ฐฐ์—ด ๋‚ด ๊ฐ ์›์†Œ๋ฅผ ํ”ผ๋ฒ—๊ณผ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๊ณผ์ •์—์„œ ์™ผ์ชฝ ํฌ์ธํ„ฐ์™€ ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๋Š” ์„œ๋กœ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ๊ฐ ์…€์„ ์ด๋™ํ•œ๋‹ค.

  • ๊ตํ™˜

    ๊ตํ™˜ ํšŸ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

    ํ‰๊ท  ์‹œ๋‚˜๋ฆฌ์˜ค์ผ ๋•Œ(๋ฐ์ดํ„ฐ ๋ฌด์ž‘์œ„ ์ •๋ ฌ)
    ๋ฐ์ดํ„ฐ๊ฐ€ N๊ฐœ๋ผ๋ฉด, '๊ตํ™˜'์€ ๋Œ€๋žต N / 4๋ฒˆ ์ผ์–ด๋‚œ๋‹ค.

  • ๋น„๊ต + ๊ตํ™˜

    N๋ฒˆ์˜ ๋น„๊ต์™€ N / 4๋ฒˆ์˜ ๊ตํ™˜์„ ๋”ํ•˜๋ฉด, ๋Œ€๋žต ์ด 1.25N ๋‹จ๊ณ„๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค.
    ๋น… ์˜ค๋Š” ์ƒ์ˆ˜๋ฅผ ๋ฌด์‹œํ•˜๋ฏ€๋กœ ๋ถ„ํ• ์˜ ํšจ์œจ์„ฑ์€ O(N)์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”Ž ๊ทธ๋Ÿฌ๋‚˜, ์ด๋Š” ํ•œ ๋ฒˆ ๋ถ„ํ• ํ•  ๋•Œ์˜ ํšจ์œจ์„ฑ์ด๋‹ค. ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์–‘ํ•œ ํฌ๊ธฐ์˜ ๋ฐฐ์—ด๊ณผ ํ•˜์œ„ ๋ฐฐ์—ด์„ ์—ฌ๋Ÿฌ ๋ฒˆ '๋ถ„ํ• 'ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํšจ์œจ์„ฑ์„ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ข€ ๋” ๋ถ„์„ํ•ด์•ผ ํ•œ๋‹ค.

  • ๊ฐ ๋ถ„ํ• ๋งˆ๋‹ค ๋ถ„ํ• ๋˜๋Š” ํ•˜์œ„ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ๋‹ค์–‘ํ•˜๋‹ค๋Š” ๊ฐ€์ • ํ•˜์—
    ๋ฐ์ดํ„ฐ๊ฐ€ N๊ฐœ์ผ ๋•Œ, ๋Œ€๋žต N * log N ๋‹จ๊ณ„๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค.
    ๋”ฐ๋ผ์„œ, ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํšจ์œจ์„ฑ์€ O(N log N)์ด๋‹ค.

  • ์ด๋Š”, ํ•˜์œ„ ๋ฐฐ์—ด์ด 1๊ฐœ์˜ ์š”์†Œ๋ฅผ ๊ฐ€์งˆ ๋•Œ๊นŒ์ง€(๊ธฐ์ € ์กฐ๊ฑด์— ๋‹ค๋‹ค๋ฅผ ๋•Œ๊นŒ์ง€), ๊ฐ ํ•˜์œ„ ๋ฐฐ์—ด์„ ๊ณ„์†ํ•ด์„œ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด์ง„ ๊ฒ€์ƒ‰์˜ ์›๋ฆฌ๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

    (์ด๋•Œ, ๋ถ„ํ• ๊ณผ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์„ ํ˜ผ๋™ํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๋ถ„ํ• ์€ ์œ„์˜ ์ฝ”๋“œ์—์„œ partition() ์ฆ‰, ๋น„๊ต & ๊ตํ™˜์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์„ ๋งํ•˜๊ณ , ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์€ ์œ„์˜ ์ฝ”๋“œ์—์„œ quickSort() ๋ฉ”์„œ๋“œ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„์„ ๋งํ•œ๋‹ค.)

  • ์ฆ‰, ๋ฐ์ดํ„ฐ๊ฐ€ N๊ฐœ์ผ ๋•Œ, ์›๋ž˜ ๋ฐฐ์—ด์„ ๊ฐ™์€ ํฌ๊ธฐ์˜ ํ•˜์œ„ ๋ฐฐ์—ด๋กœ logN๋ฒˆ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ณ , ๋‚˜๋ˆŒ ๋•Œ๋งˆ๋‹ค ์›๋ž˜ ๋ฐฐ์—ด์˜ N๊ฐœ ์…€ ์ „๋ถ€๋ฅผ ๋ถ„ํ• ํ•˜๋ฏ€๋กœ, ๋Œ€๋žต ์ด N * log N ๋‹จ๊ณ„๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค.


๐Ÿ™‹โ€โ™€๏ธ ์งˆ๋ฌธ

  1. ์—ฌ๊ธฐ ๋ฐ”๋กœ๊ฐ€๊ธฐ

โœจ ๋‚ด์ผ ํ•  ๊ฒƒ

  1. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ ํ’€์ด

  2. ์ฑ… ๊ณ„์† ์ฝ๊ธฐ

profile
๋Šฅ๋™์ ์œผ๋กœ ์‚ด์ž, ํ–‰๋ณตํ•˜๊ฒŒ๐Ÿ˜

0๊ฐœ์˜ ๋Œ“๊ธ€