์ตœ์†Ÿ๊ฐ’ ๋งŒ๋“ค๊ธฐ

8/21/2025

๋ฌธ์ œ

์ดˆ์•ˆ (์‚ฝ์ž…์ •๋ ฌ)

function solution(A, B) {
  var answer = 0;
  const arr1 = [];
  const arr2 = [];

  for (const a of A) {
    // console.log(a);
    let inserted = false;
    for (let i = 0; i < arr1.length; i++) {
      if (a < arr1[i]) {
        arr1.splice(i, 0, a);
        inserted = true;
        break;
      }
    }
    if (!inserted) arr1.push(a);
  }

  for (const b of B) {
    // console.log(b);
    let inserted = false;
    for (let i = 0; i < arr2.length; i++) {
      if (b < arr2[i]) {
        arr2.splice(i, 0, b);
        inserted = true;
        break;
      }
    }
    if (!inserted) arr2.push(b);
  }

  console.log(arr1, arr2);

  for (let i = 0; i < arr1.length; i++) {
    answer += arr1[i] * arr2[arr2.length - 1 - i];
  }

  return answer;
}

console.log(solution([1, 4, 2], [5, 4, 4]));

์™œ ์ด๋ ‡๊ฒŒ ์‰ฝ๋‚˜ ํ–ˆ๋‹ค.
์ฒ˜์Œ์— ์ด๋ ‡๊ฒŒ ํ’€์—ˆ๋”๋‹ˆ ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ์—์„œ 0/4์ .
์ •๋ ฌ์ด ๋ฐฉ๋ฒ•์ด ๋ฌธ์ œ์ธ๊ฑฐ๊ฐ™์€๋ฐ ์ผ๋ฐ˜์ •๋ ฌ ๋ง๊ณ  ๋‚ด์žฅ sort()๋ฅผ ์“ฐ๋ฉด ํ•ด๊ฒฐ๋  ๊ฒŒ ๋ถ„๋ช…ํ•œ๋ฐ,

์ˆ˜์ •์•ˆ(๋ณ‘ํ•ฉ ์ •๋ ฌ)

๊ทธ๋Ÿฌ๋ฉด ๋„ˆ๋ฌด ์‰ฌ์šฐ๋‹ˆ๊นŒ ๋ณ‘ํ•ฉ์ •๋ ฌ๋กœ ํ’€์–ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

function solution(A, B) {
  var answer = 0;
  const arr1 = mergeSort(A);
  const arr2 = mergeSort(B);

  function mergeSort(arr) {
    if (arr.length == 1) {
      return arr;
    }

    const mid = Math.floor(arr.length / 2);
    const left = mergeSort(arr.slice(0, mid));
    const right = mergeSort(arr.slice(mid));

    const temp = [];

    let i = 0;
    let j = 0;
    while (i < left.length && j < right.length) {
      const n = left[i];
      const m = right[j];
      if (n > m) {
        temp.push(n);
        i++;
      }
      if (m >= n) {
        temp.push(m);
        j++;
      }
    }

    while (i < left.length) {
      temp.push(left[i]);
      i++;
    }
    while (j < right.length) {
      temp.push(right[j]);
      j++;
    }

    return temp;
  }

  console.log(arr1, arr2);

  for (let i = 0; i < arr1.length; i++) {
    answer += arr1[i] * arr2[arr2.length - 1 - i];
  }

  return answer;
}

๊ทธ๋Ÿฐ๋ฐ ๋˜ ์‹คํŒจ.

sort() ๋‚ด์žฅ ํ•จ์ˆ˜๋กœ ์ •๋ ฌํ•˜๋‹ˆ๊นŒ ํ†ต๊ณผํ–ˆ๋‹ค..

Tim sort

์ฐธ๊ณ  :
https://velog.io/@gusdh2/sort
https://d2.naver.com/helloworld/0315536

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์žฅ ํ•จ์ˆ˜ sort()๋Š”
๊ฐ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” js์—”์ง„๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„๋๋‹ค๊ณ  ํ•œ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” V8์˜ ๊ฒฝ์šฐ(node.js๊ฐ€ ์‚ฌ์šฉ)๋Š” Tim Sort์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

Tim sort๋Š” ์‚ฝ์ž… ์ •๋ ฌ๊ณผ ๋ณ‘ํ•ฉ ์ •๋ ฌ์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ,
์ตœ์„ ์€ n, ํ‰๊ท  n log n, ์ตœ์•… n log n ์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ํ•œ๋‹ค.

์œ„์˜ ํ‘œ๋ฅผ ๋ณด๋ฉด ๋ณ‘ํ•ฉ ์ •๋ ฌ๊ณผ ํ‰๊ท , ์ตœ์•…์€ ๋˜‘๊ฐ™์€๋ฐ ์ตœ์„ ์—์„œ Tim sort๊ฐ€ ๋” ๋น ๋ฅด๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์ตœ์„ ์˜ ๊ฒฝ์šฐ์—๋Š” ์‚ฝ์ž…์ •๋ ฌ๊ณผ ๊ฐ™์€๋ฐ,
์™œ ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ–ˆ์„๋•Œ๋Š” ๋‘˜ ๋‹ค ์‹คํŒจํ–ˆ์„๊นŒ?

ํด๋กœ๋“œ์—๊ฒŒ ๋ฌผ์–ด๋ดค๋‹ค.

sort() vs ์ง์ ‘๊ตฌํ˜„

์ •๋ง ์ข‹์€ ๋ถ„์„์ž…๋‹ˆ๋‹ค! Tim Sort๊ฐ€ ์„ฑ๊ณตํ•œ ์ด์œ ๋Š”ย ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ฐ™์•„๋„ ์‹ค์ œ ์„ฑ๋Šฅ์€ ์™„์ „ํžˆ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

1.ย ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ vs JavaScript ์ฝ”๋“œ

// JavaScript๋กœ ์ง์ ‘ ๊ตฌํ˜„ - ๋А๋ฆผ
for (let i = 0; i < arr1.length; i++) {
  if (a < arr1[i]) {
    arr1.splice(i, 0, a); // ์ธํ„ฐํ”„๋ฆฌํ„ฐ์—์„œ ์‹คํ–‰
    break;
  }
}

// ๋‚ด์žฅ sort() - ๋น ๋ฆ„
arr.sort((a, b) => a - b); // C++๋กœ ๊ตฌํ˜„๋œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ์‹คํ–‰

์ฐจ์ด์ :

  • ์ง์ ‘ ๊ตฌํ˜„: JavaScript ์—”์ง„์ด ํ•œ ์ค„์”ฉ ํ•ด์„ํ•˜๋ฉฐ ์‹คํ–‰
  • Tim Sort: V8 ์—”์ง„ ๋‚ด๋ถ€์˜ย C++๋กœ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋กœ ์‹คํ–‰

2.ย ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด์˜ ์ตœ์ ํ™”

์ง์ ‘ ๊ตฌํ˜„ํ•œ ์‚ฝ์ž…์ •๋ ฌ์˜ ๋ฌธ์ œ:

arr1.splice(i, 0, a); // ๋ฐฐ์—ด ์ค‘๊ฐ„์— ์‚ฝ์ž…
  • ๋ฉ”๋ชจ๋ฆฌ ์ด๋™: ์‚ฝ์ž… ์œ„์น˜ ๋’ค์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•œ ์นธ์”ฉ ๋ฐ€์–ด์•ผ ํ•จ
  • ๋ฉ”๋ชจ๋ฆฌ ์žฌํ• ๋‹น: ๋ฐฐ์—ด ํฌ๊ธฐ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ
  • ์บ์‹œ ๋ฏธ์Šค: ๋ถˆ๊ทœ์น™ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด

Tim Sort์˜ ์ตœ์ ํ™”:

  • ์ œ์ž๋ฆฌ ์ •๋ ฌ: ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ตœ์†Œํ™”
  • ์บ์‹œ ์นœํ™”์ : CPU ์บ์‹œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉ
  • SIMD ๋ช…๋ น์–ด: ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋ช…๋ น์–ด ํ™œ์šฉ ๊ฐ€๋Šฅ

3.ย ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ ˆ๋ฒจ์˜ ์ตœ์ ํ™”

Tim Sort๋Š” ๋‹จ์ˆœํ•œ ๋ณ‘ํ•ฉ์ •๋ ฌ์ด ์•„๋‹ˆ๋ผ:

์ ์‘์  ์ •๋ ฌ:

๊ฑฐ์˜ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ: O(n)
๋žœ๋ค ๋ฐ์ดํ„ฐ: O(n log n)
์—ญ์ˆœ ๋ฐ์ดํ„ฐ: O(n) (๋Ÿฐ์„ ์—ญ์ˆœ์œผ๋กœ ์ฒ˜๋ฆฌ)

๋Ÿฐ(Run) ๊ฐ์ง€:

  • ์ด๋ฏธ ์ •๋ ฌ๋œ ๊ตฌ๊ฐ„์„ ๋ฏธ๋ฆฌ ์ฐพ์•„์„œ ํ™œ์šฉ
  • ๋ถˆํ•„์š”ํ•œ ๋น„๊ต ์—ฐ์‚ฐ ๋Œ€ํญ ๊ฐ์†Œ

๊ฐค๋กœํ•‘ ๋ชจ๋“œ:

  • ํ•œ์ชฝ ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ ์—ฐ์†์œผ๋กœ ์„ ํƒ๋  ๋•Œ ์ด์ง„ ํƒ์ƒ‰์œผ๋กœ ๊ฐ€์†ํ™”

4.ย ์‹ค์ œ ์„ฑ๋Šฅ ๋น„๊ต ์˜ˆ์‹œ

5.ย ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ์˜ ์‹ค์ œ ์ฐจ์ด

์‹œ๊ฐ„ ์ œํ•œ ์˜ˆ์‹œ (1์ดˆ):

  • Tim Sort: 10๋งŒ ๊ฐœ ์š”์†Œ๋„ 0.01์ดˆ ์ด๋‚ด
  • ์ง์ ‘ ๊ตฌํ˜„ ์‚ฝ์ž…์ •๋ ฌ: 1000๊ฐœ ์š”์†Œ๋„ 1์ดˆ ์ดˆ๊ณผ
  • ์ง์ ‘ ๊ตฌํ˜„ ๋ณ‘ํ•ฉ์ •๋ ฌ: 10๋งŒ ๊ฐœ ์š”์†Œ์— 0.5์ดˆ (์•„์Šฌ์•„์Šฌ)

๊ฒฐ๋ก 

๊ฐ™์€ ์‹œ๊ฐ„๋ณต์žก๋„์—ฌ๋„ย ์‹ค์ œ ์„ฑ๋Šฅ์€ ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค:

  1. ๊ตฌํ˜„ ์–ธ์–ด: C++ vs JavaScript
  2. ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ: ์ œ์ž๋ฆฌ ์ •๋ ฌ vs ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น
  3. ํ•˜๋“œ์›จ์–ด ์ตœ์ ํ™”: CPU ์บ์‹œ, SIMD ๋ช…๋ น์–ด ํ™œ์šฉ
  4. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ตœ์ ํ™”: ์ ์‘์  ์ •๋ ฌ, ๋Ÿฐ ๊ฐ์ง€ ๋“ฑ

๊ตํ›ˆ: ์ด๋ก ์  ์‹œ๊ฐ„๋ณต์žก๋„์™€ ์‹ค์ œ ์„ฑ๋Šฅ์€ ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค. ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ๋Š”ย ๊ฒ€์ฆ๋œ ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•œ ์„ ํƒ์ด์—์š”!