[DAY-5] JS ์ฃผ์ ๋ฌธ๋ฒ(5)
๐ ํท๊ฐ๋ ธ๋ & ๋ชฐ๋๋ ๋ถ๋ถ๋ค๋ง ์ ๋ฆฌํ๋ ๋๋ง์ TIL
๐ฏ ๋ชจ๋ ๊ฐ์ ๋ด์ฉ์ ์ ์ง ์์์!
์ค๋์ ์๊ฐ์?
์ฝ๋ฉ ํ
์คํธ ์ฐ์ต์ ์กฐ๊ธ ๋ฆ๊ฒ ์์ํ ํธ์ด๋ผ ์์ง ๋ฐฑ์ค 100๋ฌธ์ ๋ ๋ค ๋ชปํ์๋ค.
๊ทธ๋์ ์ด์งํธ๋ฆฌ๋ ์ณ๋ค๋ณด์ง๋ ๋ชปํ ๊ตฌ์ญ์ด์๋ค.. ^^...
์ญ์ ๋ฉ์๋ ์ง๊ณ ๊ธฐ๋ฅ ํ
์คํธํ๋๋ฐ์๋ง ์ค๋ ์๊ฐ ๋ค์ผ๋ค.
์์ง ์ด์งํธ๋ฆฌ์ ๋ํ ์ดํด๊ฐ ๋ถ์กฑํด์ ๋ ๊ณต๋ถํด๋ด์ผ๊ฒ ๋ค.
[+] ์ค์ต - ๊ฐ์ฅ ๋จผ ๋ ธ๋
๐ ์ ์๊ฐ์ด๊ณผ ๋๋๊ณ ..
๊ฐ์ฅ ๋จผ ๋ ธ๋๋ฅผ ๋ฑ ๋ณด๋ฉด ์๊ฐ๋๋ ๋ก์ง์ด BFS์์ต๋๋ค.
์ธ์ ๋ฆฌ์คํธ๋ก ํ์์ด์ผ ์๊ฐ ์ด๊ณผ๊ฐ ์๋ฌ์๊น,,? ์์ง JS๋ก ์ฝํ ๋ ๋ฌด๋ฆฌ๋ผ๊ณ ์๊ฐํด์..
- ์ด๊ธฐ ๋ต์
function popVal(arr) {
const val = arr[0];
for (let i = 0; i < arr.length - 1; i += 1) {
arr[i] = arr[i + 1];
}
arr.splice(-1, 1);
return val;
}
function bfs(s, arr, e) {
const visit = new Array(e + 1).fill(false);
const val = new Array(e + 1).fill(0);
const queue = [s];
visit[s] = true;
while (queue.length) {
const num = popVal(queue);
const v = val[num] + 1;
for (let node of arr) {
if (node[0] === num && !visit[node[1]]) {
queue.push(node[1]);
visit[node[1]] = true;
val[node[1]] = v;
} else if ((node[1] === num) & !visit[node[0]]) {
queue.push(node[0]);
visit[node[0]] = true;
val[node[0]] = v;
}
}
}
const maxVal = Math.max.apply(null, val);
return val.filter((i) => i === maxVal).length;
}
function solution(n, edge) {
return bfs(1, edge, n);
}
๐ฃ ํ์ด์ฌ์ผ๋ก ์ง๋ ๊ฒ ์ฒ๋ผ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ ์ฝ๋๋ก ์์ ํด๋ดค์ต๋๋ค.
- ์์ ๋ต์
function popVal(arr) {
const val = arr[0];
for (let i = 0; i < arr.length - 1; i += 1) {
arr[i] = arr[i + 1];
}
arr.splice(-1, 1);
return val;
}
function bfs(s, graph, e) {
const visit = new Array(e + 1).fill(false);
const val = new Array(e + 1).fill(0);
const queue = [s];
visit[s] = true;
while (queue.length) {
const num = popVal(queue);
const v = val[num] + 1;
for (let n of graph[num]) {
if (!visit[n]) {
queue.push(n);
visit[n] = true;
val[n] = v;
}
}
}
const maxVal = Math.max.apply(null, val);
return val.filter((i) => i === maxVal).length;
}
function solution(n, edge) {
const graph = Array.from(Array(n + 1), () => []);
for (const [a, b] of edge) {
graph[a].push(b);
graph[b].push(a);
}
return bfs(1, graph, n);
}
๐ฎ ์ฑ๋ฅ์ด ์ด๋ ๊ฒ๋ ์ฐจ์ด๊ฐ ๋๋ค๋..
์ด์ ํ์คํ JS๋ก ์ฝ๋ ์ง๋๊ฒ ๊ฐ์ด ์ค๊ธฐ ์์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
[1] ํธ๋ฆฌ(Tree)
ํธ๋ฆฌ๋ ๋ฐฉํฅ ๊ทธ๋ํ์ ์ผ์ข ์ผ๋ก ์ ์ ์ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ์ด ํ๋ ๋ฐ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
[1-1] ํธ๋ฆฌ ํน์ง
- ๋ฃจํธ ์ ์ ์ ์ ์ธํ ๋ชจ๋ ์ ์ ์ ๋ฐ๋์ ํ๋์ ๋ถ๋ชจ ์ ์ ์ ๊ฐ์ง๋๋ค.
- ์ ์ ์ด N๊ฐ์ธ ํธ๋ฆฌ๋ ๋ฐ๋์ N-1๊ฐ์ ๊ฐ์ ์ ๊ฐ์ง๋๋ค.
- ๋ฃจํธ์์ ํน์ ์ ์ ์ผ๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ ์ ์ผํฉ๋๋ค.
[1-2] ์ด์ง ํธ๋ฆฌ
์ด์ง ํธ๋ฆฌ๋ ๊ฐ ์ ์ ์ด ์ต๋ 2๊ฐ์ ์์์ ๊ฐ์ง๋ ํธ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค.
์ด์ง ํธ๋ฆฌ, ์์ ์ด์งํธ๋ฆฌ, ํฌํ ์ด์งํธ๋ฆฌ ์ด ์ธ์๋ ํธํฅ ํธ๋ฆฌ๊ฐ ์์ต๋๋ค.
ํน์ง
- ์ ์ ์ด N๊ฐ์ธ ์ด์ง ํธ๋ฆฌ๋ ์ต์ ์ ๊ฒฝ์ฐ ๋์ด๊ฐ N์ด ๋ ์ ์์ต๋๋ค.
- ์ ์ ์ด N๊ฐ์ธ ํฌํ ๋๋ ์์ ์ด์ง ํธ๋ฆฌ ๋์ด๋ log N ์ ๋๋ค.
- ๋์ด๊ฐ h์ธ ํฌํ ์ด์ง ํธ๋ฆฌ๋ 2^h-1๊ฐ์ ์ ์ ์ ๊ฐ์ง๋๋ค.
- ์ผ๋ฐ์ ์ธ ์ด์ง ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋ง์ง ์๊ณ , ๋ค์ ์๋ฃ๊ตฌ์กฐ์ ์์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
โ ์ด์ง ํ์ ํธ๋ฆฌ, ํ, AVL ํธ๋ฆฌ, ๋ ๋ ๋ธ๋ ํธ๋ฆฌ
[1-3] ๊ตฌํ ๋ฐฉ๋ฒ
ํธ๋ฆฌ๋ ์ธ์ ํ๋ ฌ, ์ธ์ ๋ฆฌ์คํธ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
- ๋ฐฐ์ด๋ก ๊ตฌํ
์ธ๋ฑ์ค * 2
๋ ์ผ์ชฝ ์ ์ , ์ธ๋ฑ์ค * 2 + 1
์ ์ค๋ฅธ์ชฝ ์ ์ ์ด ๋ฉ๋๋ค.
๋ถ๋ชจ ์ ์ ์ ์๊ณ ์ถ๋ค๋ฉด, ์ธ๋ฑ์ค // 2
(์์ซ์ ์ ๋ฒ๋ฆฐ ์ํ)๋ก ์ ์ ์์ต๋๋ค.
const tree = [
undefined,
9,
3,
8,
2,
5,
undefined,
7,
undefined,
undefined,
undefined,
4,
];
- ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๊ตฌํ
class Node {
constructor() {
this.val = val;
this.left = null;
this.right = null;
}
}
class Tree {
constructor() {
this.root = node;
}
//... methods : queue๋ฅผ ์ ์ธํด์ enqueue๋ก left, right ์์ ๋
ธ๋๋ค์ ๋ํด์ค๋ค.
}
const tree = new Tree(new Node(10));
tree.root.left = new Node(5);
tree.root.right = new Node(9);
tree.root.left.left = new Node(3);
...
[2] ํ(Heap)
์ด์ง ํธ๋ฆฌ ํํ๋ฅผ ๊ฐ์ง๋ฉฐ,
์ฐ์ ์์๊ฐ ๋์ ์์๊ฐ ๋จผ์ ๋๊ฐ๊ธฐ ์ํด ์์๊ฐ ์ฝ์
, ์ญ์ ๋ ๋ ๋ฐ๋ก ์ ๋ ฌ๋๋ ํน์ง์ด ์์ต๋๋ค.
ํ์ โ์ฐ์ ์์ ํโ๋ฅผ ๊ตฌํํ๊ธฐ์ ๊ฐ์ฅ ์ ํฉํ ์์์ ๋๋ค.
์ฐ์ ์์ ํ
FIFO์ธ ํ์ ๋ฌ๋ฆฌ ์ฐ์ ์์๊ฐ ๋์ ์์๊ฐ ๋จผ์ ๋๊ฐ๋ ํ
[2-1] ํ์ ํน์ง
- ์ฐ์ ์์๊ฐ ๋์ ์์๊ฐ ๋จผ์ ๋๊ฐ๋ ํน์ง์ด ์์ต๋๋ค.
- ๋ฃจํธ๊ฐ ๊ฐ์ฅ ํฐ ๊ฐ์ด ๋๋ ์ต๋ ํ(Max Heap)๊ณผ ๋ฃจํธ๊ฐ ๊ฐ์ฅ ์์ ๊ฐ์ด ๋๋ ์ต์ ํ(Min Heap)์ด ์์ต๋๋ค.
- JS์์๋ ์ง์ ๊ตฌํํด์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. (๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค.)
[2-2] ํ ์๊ณ ๋ฆฌ์ฆ
(1) ์์ ์ถ๊ฐ
- ์์๊ฐ ์ถ๊ฐ๋ ๋๋ ํธ๋ฆฌ์ ๊ฐ์ฅ ๋ง์ง๋ง ์ ์ ์ ์์นํฉ๋๋ค.
- ์ถ๊ฐ ํ ๋ถ๋ชจ ์ ์ ๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ผ๋ฉด ์์๋ฅผ ๋ฐ๊ฟ๋๋ค.
- ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด ๊ฒฐ๊ตญ ๊ฐ์ฅ ์ฐ์ ์์๊ฐ ๋์ ์ ์ ์ด ๋ฃจํธ๊ฐ ๋ฉ๋๋ค.
(2) ์์ ์ ๊ฑฐ
- ์์ ์ ๊ฑฐ๋ ๋ฃจํธ ์ ์ ๋ง ๊ฐ๋ฅํฉ๋๋ค.
- ๋ฃจํธ ์ ์ ์ด ์ ๊ฑฐ๋ ํ ๊ฐ์ฅ ๋ง์ง๋ง ์ ์ ์ด ๋ฃจํธ์ ์์นํฉ๋๋ค.
- ๋ฃจํธ ์ ์ ์ ๋ ์์ ์ ์ ์ค ๋ ์ฐ์ ์์๊ฐ ๋์ ์ ์ ๊ณผ ๋ฐ๊ฟ๋๋ค.
- ๋ ์์ ์ ์ ์ด ์ฐ์ ์์๊ฐ ๋ ๋ฎ์ ๋ ๊น์ง ๋ฐ๋ณตํฉ๋๋ค,
์์ ์ด์งํธ๋ฆฌ์ ๋์ด๋ log N ์ด๊ธฐ ๋๋ฌธ์, ํ์ ์์ ์ถ๊ฐ/์ ๊ฑฐ ์๊ณ ๋ฆฌ์ฆ์ O(log N)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
[2-3] ๊ตฌํ ๋ฐฉ๋ฒ
- MaxHeap
class MaxHeap {
constructor() {
this.heap = [null];
}
push(val) {
this.heap.push(val);
let curIdx = this.heap.length - 1;
let parIdx = Math.floor(curIdx / 2);
while (parIdx !== 0 && this.heap[parIdx] < val) {
const tmp = this.heap[parIdx];
this.heap[parIdx] = val;
this.heap[curIdx] = tmp;
curIdx = parIdx;
parIdx = Math.floor(curIdx / 2);
}
}
pop() {
const returnVal = this.heap[1];
this.heap[1] = this.heap.pop();
let curIdx = 1;
let leftIdx = 2;
let rightIdx = 3;
while (
this.heap[curIdx] < this.heap[leftIdx] ||
this.heap[curIdx] < this.heap[rightIdx]
) {
if (this.heap[leftIdx] < this.heap[rightIdx]) {
const tmp = this.heap[curIdx];
this.heap[curIdx] = this.heap[rightIdx];
this.heap[rightIdx] = tmp;
curIdx = rightIdx;
} else {
const tmp = this.heap[curIdx];
this.heap[curIdx] = this.heap[leftIdx];
this.heap[leftIdx] = tmp;
curIdx = leftIdx;
}
leftIdx = curIdx * 2;
rightIdx = curIdx * 2 + 1;
}
return returnVal;
}
}
const heap = new MaxHeap();
heap.push(45);
heap.push(30);
console.log(heap.heap);
heap.push(70);
console.log(heap.heap);
heap.push(43);
console.log(heap.heap);
const popArr = [];
popArr.push(heap.pop());
console.log(popArr);
console.log(heap.heap);
[+] ๊ณผ์ - MinHeap
๊ฐ๋จํ๊ฒ MaxHeap์ > ์กฐ๊ฑด์ <๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ ๊ณผ์ ์์ต๋๋ค.
MaxHeap, MinHeap์ ์ฐจ์ด๋ฅผ ์๊ณ ์๋ฆฌ๋ฅผ ์ดํดํ๊ธฐ ์ํด ๋ด์ฃผ์ ๊ณผ์ ๊ฐ์์.
- MinHeap
class MinHeap {
constructor() {
this.heap = [null];
}
push(val) {
this.heap.push(val);
let curIdx = this.heap.length - 1;
let parIdx = Math.floor(curIdx / 2);
while (parIdx !== 0 && this.heap[parIdx] > val) {
const tmp = this.heap[parIdx];
this.heap[parIdx] = val;
this.heap[curIdx] = tmp;
curIdx = parIdx;
parIdx = Math.floor(curIdx / 2);
}
}
pop() {
const returnVal = this.heap[1];
this.heap[1] = this.heap.pop();
let curIdx = 1;
let leftIdx = 2;
let rightIdx = 3;
while (
this.heap[curIdx] > this.heap[leftIdx] ||
this.heap[curIdx] > this.heap[rightIdx]
) {
if (this.heap[leftIdx] > this.heap[rightIdx]) {
const tmp = this.heap[curIdx];
this.heap[curIdx] = this.heap[rightIdx];
this.heap[rightIdx] = tmp;
curIdx = rightIdx;
} else {
const tmp = this.heap[curIdx];
this.heap[curIdx] = this.heap[leftIdx];
this.heap[leftIdx] = tmp;
curIdx = leftIdx;
}
leftIdx = curIdx * 2;
rightIdx = curIdx * 2 + 1;
}
return returnVal;
}
}
const heap = new MinHeap();
heap.push(45);
heap.push(30);
console.log(heap.heap);
heap.push(70);
console.log(heap.heap);
heap.push(43);
console.log(heap.heap);
const popArr = [];
popArr.push(heap.pop());
console.log(popArr);
console.log(heap.heap);
์ ์ผ ์์ ๊ฐ์ด root์ ๋ฐฐ์น๋๋ MinHeap๊ฐ ์ ์๋ํจ์ ์ ์ ์์ต๋๋ค.
[3] ํธ๋ผ์ด(Trie)
ํธ๋ผ์ด๋ ๋ฌธ์์ด์ ์ ์ฅํ๊ณ ํจ์จ์ ์ผ๋ก ํ์ํ๊ธฐ ์ํ ํธ๋ฆฌ ํํ์ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค.
[3-1] ํธ๋ผ์ด์ ํน์ง
- ๊ฒ์์ด ์๋์์ฑ, ์ฌ์ ์ฐพ๊ธฐ ๋ฑ์ ์์ฉ๋ ์ ์์ต๋๋ค.
- ๋ฌธ์์ด์ ํ์ํ ๋ ๋จ์ํ๊ฒ ๋น๊ตํ๋ ๊ฒ ๋ณด๋ค ํจ์จ์ ์ ๋๋ค.
- L์ด ๋ฌธ์์ด์ ๊ธธ์ด์ผ๋ ํ์, ์ฝ์ ์ O(L)๋งํผ ๊ฑธ๋ฆฝ๋๋ค.
- ๊ฐ ์ ์ ์ด ์์์ ๋ํ ๋งํฌ๋ฅผ ์ ๋ถ ๊ฐ์ง๊ณ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ์ฅ ๊ณต๊ฐ์ ๋ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
[3-2] ํธ๋ผ์ด ๊ตฌ์กฐ
- ๋ฃจํธ๋ ๋น์ด์์ต๋๋ค.
- ๊ฐ ๊ฐ์ (๋งํฌ)๋ ์ถ๊ฐ๋ ๋ฌธ์๋ฅผ ํค๋ก ๊ฐ์ง๋๋ค
- ๊ฐ ์ ์ ์ ์ด์ ์ ์ ์ ๊ฐ + ๊ฐ์ ์ ํค๋ฅผ ๊ฐ์ผ๋ก ๊ฐ์ง๋๋ค.
- ํด์ ํ ์ด๋ธ๊ณผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ ์ ์์ต๋๋ค.
[3-3] ๊ตฌํ ๋ฐฉ๋ฒ
class Node {
constructor(val = "") {
this.val = val;
this.children = new Map();
}
}
class Trie {
constructor() {
this.root = new Node();
}
insert(str) {
let curNode = this.root;
for (const char of str) {
if (!curNode.children.has(char)) {
curNode.children.set(char, new Node(curNode.val + char));
}
curNode = curNode.children.get(char);
}
}
has(str) {
let curNode = this.root;
for (const char of str) {
if (!curNode.children.has(char)) {
return false;
}
curNode = curNode.children.get(char);
}
return true;
}
}
const trie = new Trie();
trie.insert("sky");
trie.insert("ski");
console.log(trie.has("sky")); // true
console.log(trie.has("ski")); // true
console.log(trie.has("skk")); // false
[4] ์ ๋ ฌ(Sort)
(1) ๋น๊ต์ ์ ๋ ฌ
๋ค๋ฅธ ์์์ ๋น๊ต๋ฅผ ํตํด ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ
- ๋ฒ๋ธ ์ ๋ ฌ : ์๋ก ์ธ์ ํ ๋ ์์ ๊ฒ์ฌํ์ฌ ์ ๋ ฌ (O(n^2))
- ์ ํ ์ ๋ ฌ : ์ ํํ ์์์ ๊ฐ์ฅ ์ฐ์ ์์๊ฐ ๋์ ์์๋ฅผ ๊ตํํ์ฌ ์ ๋ ฌ - O(n^2)
- ์ฝ์ ์ ๋ ฌ : ์ ํํ ์์๋ฅผ ์ฝ์ ํ ์ ์๋ ์์น๋ฅผ ์ฐพ์ ์ฝ์ ํ๋ ๋ฐฉ์์ ์ ๋ ฌ - O(n^2)
(2) ๋ถ์ฐ์ ์ ๋ ฌ
์์๋ฅผ ๋ถ์ฐํ์ฌ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ
- ํฉ๋ณ ์ ๋ ฌ : ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ์ต์ ๊ณผ ์ต์ ์ด ๊ฐ์ ์์ ์ ์ธ ์ ๋ ฌ ๋ฐฉ๋ฒ - O(nlog n)
- ํต ์ ๋ ฌ : ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ๋งค์ธ ๋น ๋ฅด์ง๋ง ์ต์ ์ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ ๋ถ์์ ์ ๋ ฌ -O(nlog n)
๋ถํ ์ ๋ณต
๋ฌธ์ ๋ฅผ ์์ 2๊ฐ์ ๋ฌธ์ ๋ก ๋ถ๋ฆฌํ๊ณ , ๋ ์ด์ ๋ถ๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅํ ๋ ์ฒ๋ฆฌํ ํ ํฉ์น๋ ์ ๋ต
[+] ์ค์ต - ๊ฐ์ฅ ํฐ ์
- ์ด๊ธฐ ๋ต์
function solution(numbers) {
let answer = numbers
.map((n) => n + "")
.sort((a, b) => b + a - (a + b))
.join("");
return answer;
}
๐ โฆ?
๊ณฐ๊ณฐํ ์๊ฐํ๊ณ ์ฝ๋๋ฅผ ๊ณ ์ณ ๋ณด์์ต๋๋ค ๐โฆ
๋ค 0์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ ์ฃ์ง ์ผ์ด์ค๋ฅผ ๊ณ ๋ คํ์ง ์์๋๋ผ๊ณ ์..?
- ์์ ๋ต์
function solution(numbers) {
let answer = numbers
.map((n) => n + "")
.sort((a, b) => b + a - (a + b))
.join("");
if (parseInt(answer) === 0) {
return "0";
}
return answer;
}
[5] ์ด์ง ํ์(Binary Search)
์ ๋ ฌ ๋์ด์๋ ์์๋ค์ ๋ฐ์ฉ ์ ์ธํ๋ฉฐ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
O(lon n)๋งํผ์ ์๊ฐ๋ณต์ก๋๊ฐ ๊ฑธ๋ฆฝ๋๋ค.
[5-1] ์ด์ง ํ์ ํน์ง
- ๋ฐ๋์ ์ ๋ ฌ์ด ๋์ด์์ด์ผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ฐฐ์ด ํน์ ์ด์ง ํธ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ ์ ์์ต๋๋ค.
- O(log n) ์๊ฐ๋ณต์ก๋์ธ๋งํผ ์๋นํ ๋น ๋ฆ ๋๋ค.
- ์ต์
์ ๊ฒฝ์ฐ ํ์ชฝ์ผ๋ก ํธํฅ๋ ํธ๋ฆฌ๊ฐ ๋ ์ ์์ต๋๋ค.
์ด๋ด ๊ฒฝ์ฐ, ์์ฐจ ํ์๊ณผ ๋์ผํ ์๊ฐ๋ณต์ก๋(O(n))๋ฅผ ๊ฐ์ง๋๋ค.
โ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด AVL ํธ๋ฆฌ, ๋ ๋-๋ธ๋ ํธ๋ฆฌ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
[+] ๊ณผ์ - ์ด์ง ํ์ ํธ๋ฆฌ ์์ ์ ๊ฑฐ
์ง์ง ์ด๋ ๊ฒ ๊ธด ๋ฉ์๋๋ ๋๋ ์ฒ์ ์ง๋ณด๋๊ฑธ..? ๐ฅ
์ฌ๊ท๋ฅผ ์ด์ฉํด์ ์งฐ๋ค๊ฐ ํ์ถํ์ง ๋ชปํ๋ ์ด์๋๋ฌธ์
parentNode์,, minParent๋ฅผ ๋ฐ๋ก ์ ์ธํด์ ์ฌ์ฉํ์ต๋๋ค.
> ์ด๋ก์ ๋ฐฑ์ข ์ ์ ์๋๋ ๊ฐํํ์ค ์คํ๊ฒํฐ ์ฝ๋ ์์ฑ!!
(๋ฆฌํฉํ ๋ง ํ๊ณ ๋ค์ ์ฌ๋ ค์ผ๊ฒ ๋ค. ๋๋ฌด๋๋ ๋ถ๋๋ฝ๋ค.)
delete(val) {
let curNode = this.root;
let parentNode = null;
while (curNode !== null) {
// ํ์ ์งํ
if (curNode.val < val) {
parentNode = curNode;
curNode = curNode.right;
}
else if (curNode.val > val) {
parentNode = curNode;
curNode = curNode.left;
}
else {
// ๋ฆฌํ๋
ธ๋์ผ ๊ฒฝ์ฐ
if (curNode.left === null && curNode.right === null) {
console.log('leaf')
if (parentNode.val < curNode.val) {
parentNode.right = null;
return;
}
parentNode.left = null;
return;
}
// ์์์ด ํ๋์ผ๋
else if (curNode.left && !curNode.right) {
if (parentNode.val < curNode.val) {
parentNode.right = curNode.left;
return curNode;
}
parentNode.left = curNode.left
return curNode;
}
else if (!curNode.left && curNode.right) {
if (parentNode.val < curNode.val) {
parentNode.right = curNode.right;
return curNode;
}
parentNode.left = curNode.right
return curNode;
}
if (curNode.val < parentNode.val) {
let min = curNode.right;
let minParent = curNode.right;
while (min.left) {
minParent = min;
min = min.left;
}
if (minParent === min) {
parentNode.left = min;
min.left = curNode.lfet;
curNode.right = null;
} else {
if (min.right) {
minParent.left = min.right;
}
else {
minParent.left = null;
}
}
parentNode.left = min;
min.right = curNode.right;
min.left = curNode.left;
} else {
let min = curNode.right;
let minParent = curNode.right;
while (min.left) {
minParent = min;
min = min.left;
}
if (minParent === min) {
parentNode.right = min;
min.left = curNode.lfet;
curNode.right = null;
} else {
if (min.right) {
minParent.left = min.right;
}
else {
minParent.left = null;
}
}
parentNode.right = min;
min.right = curNode.right;
min.left = curNode.left
}
return curNode;
}
}
return null;
}
[+] ์ค์ต - ์ ๊ตญ์ฌ์ฌ
์ ๋ ฅ์ ์ต๋ ๋ฒ์๊ฐ 1,000,000,000์ด๋ฏ๋ก ์ด์ง ํ์์ด๊ฒ ๊ตฌ๋ ์ถ์ธกํ์ต๋๋ค.
์ด์งํ์โฆํ๋ฒ๋ ํ์ด๋ณธ ์ ์๋๋ฐ ๐ฅ
- ๋ต์
function binarySearch(n, times) {
let left = 0;
let right = n * times[times.length - 1]; // n * ๊ฐ์ฅ ๊ธด ์ฌ์ฌ๋
let answer = right;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
let max = 0;
for (let t of times) {
max += Math.floor(mid / t);
}
if (max < n) {
// ์ฌ์ฌํ ์ธ์์ด ์ ์ด์
left = mid + 1;
} else {
// ์ฌ์ฌํ ์ธ์์ด ์ด๊ณผ๋์์ผ๋ right(์ต๋) - 1
answer = Math.min(mid, answer);
right = mid - 1;
}
mid = Math.floor((left + right) / 2);
}
return answer;
}
function solution(n, times) {
times.sort((a, b) => a - b); // ์ด๋ถํ์์ ์ ๋ ฌ ํ์ ์ฌ์ฉ ๊ฐ๋ฅ
return binarySearch(n, times);
}
์ด์งํ์ ์ฝ๋๋ฅผ ๊ฑฐ์ ๋ณต๋ถํ๋ค์ํผ ์ด์ฉํ์ต๋๋ค.
JS ์ด์งํ์ ์ฝ๋ ์ธ์ด ํ, ์ฌ์ฉํ ์ ์์ ๋งํผ ์ดํดํด๋์.
๋๊ธ๋จ๊ธฐ๊ธฐ