์ด์ (์ฝ์ ์ ๋ ฌ)
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์ด (์์ฌ์์ฌ)
๊ฒฐ๋ก
๊ฐ์ ์๊ฐ๋ณต์ก๋์ฌ๋ย ์ค์ ์ฑ๋ฅ์ ์์ ํ ๋ค๋ฆ ๋๋ค:
- ๊ตฌํ ์ธ์ด: C++ vs JavaScript
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ: ์ ์๋ฆฌ ์ ๋ ฌ vs ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
- ํ๋์จ์ด ์ต์ ํ: CPU ์บ์, SIMD ๋ช ๋ น์ด ํ์ฉ
- ์๊ณ ๋ฆฌ์ฆ ์ต์ ํ: ์ ์์ ์ ๋ ฌ, ๋ฐ ๊ฐ์ง ๋ฑ
๊ตํ: ์ด๋ก ์ ์๊ฐ๋ณต์ก๋์ ์ค์ ์ฑ๋ฅ์ ๋ณ๊ฐ์ ๋๋ค. ์ฝ๋ฉํ ์คํธ์์๋ย ๊ฒ์ฆ๋ ๋ด์ฅ ํจ์๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ํ๋ช ํ ์ ํ์ด์์!