pop() λ°°μ΄ λ·λΆλΆμ κ°μ μμ
var arr = [ 1, 2, 3, 4 ];
arr.pop();
console.log( arr ); // [ 1, 2, 3 ]
push() λ°°μ΄ λ·λΆλΆμ κ°μ μ½μ
var arr = [ 1, 2, 3, 4 ];
arr.push( 5 );
console.log( arr ); // [ 1, 2, 3, 4, 5 ]
unshift() λ°°μ΄ μλΆλΆμ κ°μ μ½μ
var arr = [ 1, 2, 3, 4 ];
arr.unshift( 0 );
console.log( arr ); // [ 0, 1, 2, 3, 4 ]
shift() λ°°μ΄ μλΆλΆμ κ°μ μμ
var arr = [ 1, 2, 3, 4 ];
arr.shift();
console.log( arr ); // [ 2, 3, 4 ]
splice() λ°°μ΄μ νΉμ μμΉμ μμλ₯Ό μΆκ°νκ±°λ μμ splice( index, μ κ±°ν μμ κ°μ, λ°°μ΄μ μΆκ°λ μμ )
var arr = [ 1, 2, 3, 4, 5, 6, 7 ];
arr.splice( 3, 2 );
console.log( arr ); // [ 1, 2, 3, 6, 7 ] 3λ²μ§Έ μΈλ±μ€μμλΆν° 2κ° μ κ±°
var arr = [ 1, 2, 3, 4, 5, 6, 7 ];
arr.splice( 2, 1, "a", "b");
console.log( arr ); // [ 1, 2, "a", "b", 4, 5, 6, 7 ] 2λ²μ§Έ μΈλ±μ€μμ 1κ° μ κ±° ν "a"μ "b"λ₯Ό μΆκ°
slice(startIndex, endIndex) λ°°μ΄μ startIndexλΆν° endIndexκΉμ§(endIndexλ λΆν¬ν¨)μ λν shallow copyλ₯Ό μλ‘μ΄ λ°°μ΄ κ°μ²΄λ‘ λ°ν
var arr = [ 1, 2, 3, 4, 5, 6, 7 ];
var newArr = arr.slice( 3, 6 );
console.log( 'slice', newArr ); // [ 4, 5, 6 ]
concat() λ€μμ λ°°μ΄μ ν©μΉκ³ λ³ν©λ λ°°μ΄μ μ¬λ³Έμ λ°ν
var arr1 = [ 1, 2, 3 ];
var arr2 = [ 4, 5, 6 ];
var arr3 = arr2.concat( arr1 );
console.log( arr3 ); // [ 4, 5, 6, 1, 2, 3 ]
every() λ°°μ΄μ λͺ¨λ μμκ° μ 곡ν ν¨μλ‘ κ΅¬νλ ν μ€νΈλ₯Ό ν΅κ³Όνλμ§λ₯Ό ν μ€νΈ
var arr =[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
var isEven = function( value ) {
// valueκ° 2μ λ°°μμ΄λ©΄ trueλ₯Ό λ°ννλ€.
return value % 2 === 0;
};
console.log( arr.every( isEven ) ); // false λͺ¨λ μμκ° trueμ΄λ©΄ trueλ₯Ό return νκ³ κ·Έλ μ§ μμΌλ©΄ false
some() μ§μ λ ν¨μμ κ²°κ³Όκ° trueμΌ λκΉμ§ λ°°μ΄μ κ° μμλ₯Ό λ°λ³΅
var arr =[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
var isEven = function( value ) {
// valueκ° 2μ λ°°μμ΄λ©΄ trueλ₯Ό λ°ννλ€.
return value % 2 === 0;
};
console.log( arr.some( isEven ) ); // true νλλΌλ trueμ΄λ©΄ trueλ₯Ό return
forEach() λ°°μ΄μ κ° μμλ³λ‘ μ§μ λ ν¨μλ₯Ό μ€ννλ€.
var arr =[ 1, 2, 3 ];
arr.forEach( function( value ) {
console.log( value ); // 1 2 3
});
const paired = {};
arr.forEach((x) => {
paired[x] = (paired[x] || 0) + 1; // μ€λ³΅ κ°μ ꡬν¨
}) // κ²°κ³Ό {'1': 2, '2': 4 ...}
map() λ°°μ΄μ κ° μμλ³λ‘ μ§μ λ ν¨μλ₯Ό μ€νν κ²°κ³Όλ‘ κ΅¬μ±λ μλ‘μ΄ λ°°μ΄μ λ°ννλ€.
var arr =[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
var isEven = function( value ) {
return value % 2 === 0;
};
var newArr = arr.map( isEven );
console.log( newArr ); // [ false, true, false, true, false, true, false, true, false, true ]
filter() μ§μ λ ν¨μμ κ²°κ³Ό κ°μ trueλ‘ λ§λλ μμλ€λ‘λ§ κ΅¬μ±λ λ³λμ λ°°μ΄μ λ°ννλ€.
var arr =[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
var isEven = function( value ) {
return value % 2 === 0;
};
var newArr = arr.filter( isEven );
console.log( newArr ); // [ 2, 4, 6, 8, 10 ]
reduce() λμ°κΈ°(accumulator) λ° λ°°μ΄μ κ° κ°(μ’μμ μ°λ‘)μ λν΄ (λμ°λ) ν κ°μΌλ‘ μ€λλ‘ ν¨μλ₯Ό μ μ©
var arr =[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
var value = arr.reduce( function( previousValue, currentValue, index ) {
return previousValue + currentValue;
});
console.log( value ); // 55
reverse() λ°°μ΄μ μμ μμλ₯Ό κ±°κΎΈλ‘ λ°κΎΌλ€.
var arr =[ 1, 2, 3, 4 ];
arr.reverse();
console.log( arr ); // [ 4, 3, 2, 1 ]
sort() λ°°μ΄μ μμλ₯Ό μνλ²³μμΌλ‘, λλ μ§μ λ ν¨μμ λ°λ₯Έ μμλ‘ μ λ ¬νλ€. λͺ¨λ μμλ₯Ό λ¬Έμμ΄λ‘ μ·¨κΈν΄ μ¬μ μ μΌλ‘ μ λ ¬
var arr = [ 13, 12, 11, 10, 5, 3, 2, 1 ];
arr.sort();
console.log( arr ); // [ 1, 10, 11, 12, 13, 2, 3, 5 ];
// sortμ ν¨μλ‘ μ λ ¬
var arr = [ 13, 12, 11, 10, 5, 3, 2, 1 ];
arr.sort( function( a, b ) {
return a - b;
})
console.log( arr ); // [ 1, 2, 3, 5, 10, 11, 12, 13 ]
toString() λ°°μ΄μ λ¬Έμμ΄λ‘ λ°κΎΈμ΄ λ°ννλ€, toString(2) μ΄μ§μ μ€νΈλ§μΌλ‘ λ³ν
var arr =[ 1, 2, 3, 4 ];
console.log( arr.toString() ); // 1, 2, 3, 4
valueOf() toStringκ³Ό λΉμ·, κ·Έλ¬λ λ°°μ΄μ λ°ν
var arr =[ 1, 2, 3, 4 ];
console.log( arr.valueOf() ); // [ 1, 2, 3, 4 ]
join() λ°°μ΄ μμ μ λΆλ₯Ό νλμ λ¬Έμμ΄λ‘ ν©μΉλ€.
var arr =[ 1, 2, 3, 4 ];
console.log( arr.join() ); // 1,2,3,4
console.log( arr.join( '-' ) ); // 1-2-3-4
μλ£ μΆμ²: Learning JavaScript Data Structures and Algorithms νκ΅μ΄ν [μλ°μ€ν¬λ¦½νΈ μλ£ κ΅¬μ‘°μ μκ³ λ¦¬μ¦] http://www.acornpub.co.kr/book/javascript-data-structure
Object.keys() κ°μ²΄κ° κ°μ§κ³ μλ ν€λ€μ λͺ©λ‘μ λ°°μ΄λ‘ 리ν΄νλ λ©μλμ΄λ€.
const obj = {
name: 'melon',
weight: 4350,
price: 16500,
isFresh: true
}
Object.keys(obj) // ['name', 'weight', 'price', 'isFresh']
Object.values() κ°μ²΄μ ν€κ° μλ κ°μΌλ‘ μ΄λ£¨μ΄μ§ λ°°μ΄μ 리ν΄ν©λλ€.
Object.entries() κ°μ²΄μ ν€μ κ°μ μμΌλ‘ μ΄λ£¨μ΄μ§ κΈΈμ΄ 2μ§λ¦¬ λ°°μ΄λ‘ μ΄λ£¨μ΄μ§, λ°°μ΄μ 리ν΄ν©λλ€. κ° λ°°μ΄μμ μΈλ±μ€ [0]μ κ°μ κ°κ°μ ν€λ₯Ό, μΈλ±μ€ [1]μ κ°μ ν΄λΉ ν€μ ν΄λΉνλ κ°μ κ°μ§κ² λ©λλ€.
const values = Object.values(obj)
// values === ['melon', 4350, 16500, true]
const entries = Object.entries(obj)
/*
entries === [
['name', 'melon'],
['weight', 4350],
['price', 16500],
['isFresh', true]
]
*/
Math.max(), Math.min(): μ£Όμ΄μ§ μ«μ μ€ κ°μ₯ ν° κ° λλ μμ κ° λ°νν©λλ€. Math.abs(): μ«μμ μ λκ°μ λ°νν©λλ€. Math.floor(), Math.ceil(), Math.round(): μμμ μ΄νλ₯Ό λ²λ¦¬κ±°λ μ¬λ¦Ό, λ°μ¬λ¦Όν©λλ€. Math.random(): 0λΆν° 1 μ¬μ΄μ λμλ₯Ό λ°νν©λλ€.
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "input.txt";
const input = fs.readFileSync(filePath).toString().trim().split("\n");
const [N, M] = input1.shift().split(" ").map(Number);
// const input = JSON.parse(JSON.stringify(input1)); κΉμ 볡μ¬
// 1. νλμ κ°μ μ
λ ₯λ°μ λ
const input = require("fs").readFileSync("/dev/stdin").toString().trim();
// 2. 곡백μΌλ‘ ꡬλΆλ ν μ€μ κ°λ€μ μ
λ ₯λ°μ λ
const input = require("fs").readFileSync("/dev/stdin").toString().trim().split(" ");
// 3. μ¬λ¬ μ€μ κ°λ€μ μ
λ ₯λ°μ λ
const input = require("fs").readFileSync("/dev/stdin").toString().trim().split("\n");
// 4. 첫 λ²μ§Έ μ€μ μμ°μ nμ μ
λ ₯λ°κ³ , κ·Έ λ€μμ€μ 곡백μΌλ‘ ꡬλΆλ nκ°μ κ°λ€μ μ
λ ₯λ°μ λ
const [n, ...arr] = require("fs").readFileSync("/dev/stdin").toString().trim().split(/\s/);
// 5. 첫 λ²μ§Έ μ€μ μμ°μ nμ μ
λ ₯λ°κ³ , κ·Έ λ€μμ€λΆν° nκ°μ μ€μ κ±Έμ³ ν μ€μ νλμ κ°μ μ
λ ₯λ°μ λ
const [n, ...arr] = require("fs").readFileSync("/dev/stdin").toString().trim().split("\n");
// 6. νλμ κ° λλ 곡백μΌλ‘ ꡬλΆλ μ¬λ¬ κ°λ€μ μ¬λ¬ μ€μ κ±Έμ³ λ€μ£½λ°μ£½ μμ¬μ μ
λ ₯λ°μ λ
// ex) n μ
λ ₯ - 곡백μΌλ‘ ꡬλΆλ nκ°μ κ° μ
λ ₯ - m μ
λ ₯ - μ¬λ¬ μ€μ κ±Έμ³ mκ°μ κ° μ
λ ₯
const input = require("fs").readFileSync("/dev/stdin").toString().trim().split(/\s/);
const n = input[0];
const n_arr = input.slice(1, n + 1);
const [m, ...m_arr] = input.slice(n + 1);
// 2~6μμ μ
λ ₯λ°λ κ°λ€μ λͺ¨λ Stringμμ Numberλ‘ λ°κΎΈλ €λ©΄ split()λ€μ .map(Number)λ₯Ό μΆκ°
μ΄μ§ νμ(Binary Search)μ μ λ ¬λ λ°°μ΄μμ νΉμ ν κ°μ μμΉλ₯Ό μ°Ύλ μκ³ λ¦¬μ¦μ λλ€. μ΄ μκ³ λ¦¬μ¦μ λ°°μ΄μ λ°μΌλ‘ λλμ΄ νμ λ²μλ₯Ό μ€μ¬κ°λ©΄μ κ°μ μ°Ύμλ΄λ ν¨μ¨μ μΈ λ°©λ²μ λλ€. μ΄μ§ νμμ μ£Όμ΄μ§ λ°°μ΄μ΄ μ λ ¬λμ΄ μμ΄μΌλ§ μ¬μ©ν μ μμ΅λλ€.
μλλ μ΄μ§ νμ μκ³ λ¦¬μ¦μ κΈ°λ³Έμ μΈ κ΅¬νμ λλ€:
function binarySearch(arr, target) {
let left = 0; // λ°°μ΄μ μΌμͺ½ λ μΈλ±μ€
let right = arr.length - 1; // λ°°μ΄μ μ€λ₯Έμͺ½ λ μΈλ±μ€
while (left <= right) {
const mid = Math.floor((left + right) / 2); // μ€κ° μΈλ±μ€ κ³μ°
if (arr[mid] === target) {
return mid; // κ°μ μ°Ύμμ λ μ€κ° μΈλ±μ€ λ°ν
} else if (arr[mid] < target) {
left = mid + 1; // μ€κ° κ°λ³΄λ€ ν° κ²½μ°, μΌμͺ½ λ²μλ₯Ό μ‘°μ
} else {
right = mid - 1; // μ€κ° κ°λ³΄λ€ μμ κ²½μ°, μ€λ₯Έμͺ½ λ²μλ₯Ό μ‘°μ
}
}
return -1; // κ°μ μ°Ύμ§ λͺ»ν κ²½μ° -1 λ°ν
}
μμ μ½λμμ arr
μ μ λ ¬λ λ°°μ΄μ΄λ©°, target
μ μ°Ύκ³ μ νλ κ°μ
λλ€. μ΄μ§ νμμ λ°°μ΄μ μΌμͺ½ λ μΈλ±μ€ left
μ μ€λ₯Έμͺ½ λ μΈλ±μ€ right
λ₯Ό μ¬μ©νμ¬ νμ λ²μλ₯Ό μ‘°μ ν©λλ€. κ° λ°λ³΅μμ μ€κ° μΈλ±μ€ mid
λ₯Ό κ³μ°νκ³ , ν΄λΉ μΈλ±μ€μ κ°κ³Ό target
μ λΉκ΅νμ¬ νμ λ²μλ₯Ό μ‘°μ ν©λλ€.
μ΄μ§ νμμ μκ° λ³΅μ‘λλ O(log n)μ λλ€. μ΄λ λ°°μ΄μ ν¬κΈ°μ λν΄ λ‘κ·Έ μκ°μΌλ‘ νμμ μννκΈ° λλ¬Έμ λ§€μ° ν¨μ¨μ μ λλ€.
μλ°μ€ν¬λ¦½νΈλ‘ BFS(Breadth-First Search)μ DFS(Depth-First Search) ν¨μλ₯Ό ꡬνν΄ λ³΄κ² μ΅λλ€. λ¨Όμ , κ°λ¨ν κ·Έλν ꡬ쑰λ₯Ό νννκΈ° μν΄ μΈμ 리μ€νΈλ₯Ό μ¬μ©νκ² μ΅λλ€.
// BFS: λλΉ μ°μ νμ
function bfs(root) {
const queue = [root]; // νλ₯Ό μ΄μ©νμ¬ λ°©λ¬Έν λ
Έλλ₯Ό μ μ§
const visited = new Set(); // λ°©λ¬Έν λ
Έλλ₯Ό μΆμ νκΈ° μν Set
while (queue.length > 0) {
const node = queue.shift(); // νμμ 첫 λ²μ§Έ μμ μΆμΆ
if (!visited.has(node)) {
visited.add(node); // λ°©λ¬Έν λ
Έλλ₯Ό κΈ°λ‘
console.log(node); // λ
Έλλ₯Ό λ°©λ¬Έν λλ§λ€ μΆλ ₯
// λ
Έλμ μμ(μ΄μ) λ
Έλλ₯Ό νμ μΆκ°
if (node.children) {
for (const child of node.children) {
queue.push(child);
}
}
}
}
}
// DFS: κΉμ΄ μ°μ νμ
function dfs(node, visited = new Set()) {
if (!node || visited.has(node)) {
return; // λ
Έλκ° nullμ΄κ±°λ μ΄λ―Έ λ°©λ¬Έν λ
ΈλμΈ κ²½μ° μ’
λ£
}
visited.add(node); // λ°©λ¬Έν λ
Έλλ₯Ό κΈ°λ‘
console.log(node); // λ
Έλλ₯Ό λ°©λ¬Έν λλ§λ€ μΆλ ₯
// λ
Έλμ μμ(μ΄μ) λ
Έλλ₯Ό μ¬κ·μ μΌλ‘ λ°©λ¬Έ
if (node.children) {
for (const child of node.children) {
dfs(child, visited);
}
}
}
// μμ λ
Έλ μ μ
const node1 = {
val: 1,
children: [
{ val: 2, children: [{ val: 4 }] },
{ val: 3, children: [{ val: 5 }] },
],
};
console.log("BFS:");
bfs(node1);
console.log("\nDFS:");
dfs(node1);
μ μ½λμμλ κ°λ¨ν μΈμ 리μ€νΈλ‘ κ·Έλνλ₯Ό νννκ³ , BFS ν¨μμ DFS ν¨μλ₯Ό ꡬννμ΅λλ€. κ° ν¨μλ κ·Έλνμ μμ λ Έλλ₯Ό μ λ ₯μΌλ‘ λ°μ΅λλ€. BFS ν¨μλ νλ₯Ό μ¬μ©νμ¬ λλΉ μ°μ νμμ μννκ³ , DFS ν¨μλ μ¬κ·μ μΌλ‘ κΉμ΄ μ°μ νμμ μνν©λλ€.
// BFSμ DFSμ ν΅μ¬ λ‘μ§μ΄ λμΌν ν¨μ
function search(root, isBFS = true) {
const queueOrStack = [root]; // ν λλ μ€νμ μ΄μ©νμ¬ λ°©λ¬Έν λ
Έλλ₯Ό μ μ§
const visited = new Set(); // λ°©λ¬Έν λ
Έλλ₯Ό μΆμ νκΈ° μν Set
while (queueOrStack.length > 0) {
const node = isBFS ? queueOrStack.shift() : queueOrStack.pop(); // ν λλ μ€νμμ μμ μΆμΆ
if (!visited.has(node)) {
visited.add(node); // λ°©λ¬Έν λ
Έλλ₯Ό κΈ°λ‘
console.log(node); // λ
Έλλ₯Ό λ°©λ¬Έν λλ§λ€ μΆλ ₯
// λ
Έλμ μμ(μ΄μ) λ
Έλλ₯Ό ν λλ μ€νμ μΆκ°
if (node.children) {
for (const child of node.children) {
isBFS ? queueOrStack.push(child) : queueOrStack.unshift(child);
}
}
}
}
}
// μμ λ
Έλ μ μ
const node1 = {
val: 1,
children: [
{ val: 2, children: [{ val: 4 }] },
{ val: 3, children: [{ val: 5 }] },
],
};
console.log("BFS:");
search(node1, true);
console.log("\nDFS:");
search(node1, false);
Oλ μκ° λ³΅μ‘λ(μκ³ λ¦¬μ¦μ μ€ν μκ°)λ₯Ό λνλ΄λ νκΈ°λ² μ€ νλμ λλ€. μκ³ λ¦¬μ¦μ΄ μ λ ₯ ν¬κΈ°μ λ°λΌ μ€ν μκ°μ΄ μ΄λ»κ² μ¦κ°νλμ§λ₯Ό λνλ λλ€. λ³΄ν΅ μ΅μ μ κ²½μ°λ₯Ό κ³ λ €νμ¬ ννλ©λλ€.
- Big O νκΈ°λ²(O): μκ³ λ¦¬μ¦μ μ€ν μκ°μ΄ μ λ ₯ ν¬κΈ°μ λν΄ μΌλ§λ μ¦κ°νλμ§λ₯Ό λνλ λλ€.
- O(1): μμ μκ°, μ λ ₯ ν¬κΈ°μ κ΄κ³μμ΄ μΌμ ν μκ°μ΄ μμλ©λλ€.
- O(log n): λ‘κ·Έ μκ°, μ λ ₯ ν¬κΈ°μ λ‘κ·Έμ λΉλ‘νλ μκ°μ΄ μμλ©λλ€. μλ₯Ό λ€μ΄ μ΄μ§ νμ μκ³ λ¦¬μ¦μ΄ μ΄μ ν΄λΉν©λλ€.
- O(n): μ ν μκ°, μ λ ₯ ν¬κΈ°μ λΉλ‘νλ μκ°μ΄ μμλ©λλ€.
- O(n log n): μ ν λ‘κ·Έ μκ°, μ λ ₯ ν¬κΈ°μ λ‘κ·Έμ λΉλ‘νκ² μ¦κ°νλ μκ°μ΄ μμλ©λλ€. μλ₯Ό λ€μ΄ ν΅ μ λ ¬κ³Ό λ³ν© μ λ ¬μ΄ μ΄μ ν΄λΉν©λλ€.
- O(n^2): μ κ³± μκ°, μ λ ₯ ν¬κΈ°μ μ κ³±μ λΉλ‘νλ μκ°μ΄ μμλ©λλ€. μ΄μ€ λ°λ³΅λ¬Έμ μ¬μ©νλ μ λ ¬ μκ³ λ¦¬μ¦μ΄ μ΄μ ν΄λΉν©λλ€.
- O(2^n): μ§μ μκ°, μ λ ₯ ν¬κΈ°μ μ§μμ λΉλ‘νλ μκ°μ΄ μμλ©λλ€. μ¬κ·μ μΈ κ²½μ°κ° λνμ μ λλ€.
- O(n!): ν©ν λ¦¬μΌ μκ°, μ λ ₯ ν¬κΈ°μ ν©ν 리μΌμ λΉλ‘νλ μκ°μ΄ μμλ©λλ€. λ§€μ° λΉν¨μ¨μ μΈ μκ³ λ¦¬μ¦μ λλ€.
DFSμ BFSμ μκ° λ³΅μ‘λλ λ€μκ³Ό κ°μ΅λλ€:
- DFS(Depth-First Search): μΈμ 리μ€νΈλ₯Ό μ¬μ©ν κ²½μ° O(V + E)μ μκ° λ³΅μ‘λλ₯Ό κ°μ΅λλ€. Vλ λ Έλ μμ΄κ³ , Eλ κ°μ μμ λλ€.
- BFS(Breadth-First Search): μΈμ 리μ€νΈλ₯Ό μ¬μ©ν κ²½μ° O(V + E)μ μκ° λ³΅μ‘λλ₯Ό κ°μ΅λλ€. Vλ λ Έλ μμ΄κ³ , Eλ κ°μ μμ λλ€.
- λ³ν© μ λ ¬ (Merge Sort):
function mergeSort(arr) {
if (arr.length <= 1) {
return arr;
}
const middle = Math.floor(arr.length / 2);
const left = arr.slice(0, middle);
const right = arr.slice(middle);
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
let result = [];
let leftIndex = 0;
let rightIndex = 0;
while (leftIndex < left.length && rightIndex < right.length) {
if (left[leftIndex] < right[rightIndex]) {
result.push(left[leftIndex]);
leftIndex++;
} else {
result.push(right[rightIndex]);
rightIndex++;
}
}
return result.concat(left.slice(leftIndex)).concat(right.slice(rightIndex));
}
- ν΅ μ λ ¬ (Quick Sort):
function quickSort(arr) {
if (arr.length <= 1) {
return arr;
}
const pivot = arr[Math.floor(arr.length / 2)];
const left = [];
const right = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} else if (arr[i] > pivot) {
right.push(arr[i]);
}
}
return [...quickSort(left), pivot, ...quickSort(right)];
}
- ν μ λ ¬ (Heap Sort):
function heapSort(arr) {
buildMaxHeap(arr);
for (let i = arr.length - 1; i > 0; i--) {
[arr[0], arr[i]] = [arr[i], arr[0]];
maxHeapify(arr, 0, i);
}
return arr;
}
function buildMaxHeap(arr) {
const len = arr.length;
for (let i = Math.floor(len / 2); i >= 0; i--) {
maxHeapify(arr, i, len);
}
}
function maxHeapify(arr, i, len) {
let largest = i;
const left = 2 * i + 1;
const right = 2 * i + 2;
if (left < len && arr[left] > arr[largest]) {
largest = left;
}
if (right < len && arr[right] > arr[largest]) {
largest = right;
}
if (largest !== i) {
[arr[i], arr[largest]] = [arr[largest], arr[i]];
maxHeapify(arr, largest, len);
}
}
μ΄ μ½λλ€μ κ°κ°μ μ λ ¬ μκ³ λ¦¬μ¦μ ꡬνν κ²μ λλ€. κ° ν¨μμ μ λ ¬νκ³ μ νλ λ°°μ΄μ μΈμλ‘ μ λ¬νλ©΄ ν΄λΉ μκ³ λ¦¬μ¦μ λ°λΌ μ λ ¬λ λ°°μ΄μ λ°νν©λλ€.
그리λ μκ³ λ¦¬μ¦μ κ° λ¨κ³μμ κ°μ₯ μ΅μ μΈ μ νμ νλ λ°©μμΌλ‘ λμν©λλ€. κ·Έλ κΈ° λλ¬Έμ κ° λ¨κ³μμ μ νν μ μλ κ°μ₯ μ’μ μ νμ κ³ λ₯΄λ κ²μ΄ μ€μν©λλ€. μλλ κ°λ¨ν μμλ‘ κ·Έλ¦¬λ μκ³ λ¦¬μ¦μ νμ©νμ¬ νλ μ ν λ¬Έμ (Activity Selection Problem)λ₯Ό ν΄κ²°νλ μ½λμ λλ€.
νλ μ ν λ¬Έμ λ μ¬λ¬ νλμ΄ μ£Όμ΄μ‘μ λ, κ²ΉμΉμ§ μκ² κ°μ₯ λ§μ νλμ μ ννλ λ¬Έμ μ λλ€. κ° νλμ μμ μκ°κ³Ό λ μκ°μ΄ μ£Όμ΄μ§λ©°, μλ‘ κ²ΉμΉμ§ μκ² μ΅λν λ§μ νλμ μ νν΄μΌ ν©λλ€.
function activitySelection(activities) {
// νλμ λλλ μκ°μ κΈ°μ€μΌλ‘ μ λ ¬
activities.sort((a, b) => a.end - b.end);
const selectedActivities = [activities[0]]; // 첫 λ²μ§Έ νλμ 무쑰건 μ ν
let prevEnd = activities[0].end;
for (let i = 1; i < activities.length; i++) {
const currentActivity = activities[i];
// νμ¬ νλμ΄ μ΄μ νλκ³Ό κ²ΉμΉμ§ μλ κ²½μ°μ μ ν
if (currentActivity.start >= prevEnd) {
selectedActivities.push(currentActivity);
prevEnd = currentActivity.end;
}
}
return selectedActivities;
}
// νλ μ ν λ¬Έμ μ λν μμ μ
λ ₯ λ°μ΄ν°
const activities = [
{ start: 1, end: 4 },
{ start: 3, end: 5 },
{ start: 0, end: 6 },
{ start: 5, end: 7 },
{ start: 3, end: 8 },
{ start: 5, end: 9 },
{ start: 6, end: 10 },
{ start: 8, end: 11 },
{ start: 8, end: 12 },
{ start: 2, end: 13 },
{ start: 12, end: 14 },
];
// νλ μ ν λ¬Έμ ν΄κ²°
const selectedActivities = activitySelection(activities);
console.log("Selected activities:", selectedActivities);
μμ μ½λλ νλ μ ν λ¬Έμ λ₯Ό 그리λ μκ³ λ¦¬μ¦μΌλ‘ ν΄κ²°νλ λ°©λ²μ 보μ¬μ€λλ€. νλμ λλλ μκ°μ κΈ°μ€μΌλ‘ μ λ ¬ν ν, κ° λ¨κ³μμ κ°μ₯ 빨리 λλλ νλμ μ ννμ¬ μ΅λν λ§μ νλμ μ νν©λλ€.
// 20κ°μ λ°°μ΄ μμ± μ κ° κ°μ΄ indexμΈ λ°°μ΄
const stringArray = Array.from({ length: 20 }, (_, index) => index.toString());
slice(startIndex, endIndex)
: λ¬Έμμ΄μ μμ μΈλ±μ€λΆν° μ’
λ£ μΈλ±μ€ μ§μ κΉμ§ μλ¦
λλ€. endIndexλ ν¬ν¨μν¨
μμ μΈλ±μ€λ₯Ό μ¬μ©νλ©΄ λ¬Έμμ΄μ λμμλΆν° μμμΌλ‘ μΈμ΄μ§λλ€.
const str = "Hello, world!";
const sliced = str.slice(0, 5); // "Hello"
const sliced2 = str.slice(-6); // "world!"
substring(startIndex, endIndex)
: slice()μ λΉμ·νμ§λ§ μμ μΈλ±μ€λ₯Ό μ§μνμ§ μμ΅λλ€. λ§μ½ startIndexμ΄ endIndexλ³΄λ€ ν¬λ©΄ λ μΈλ±μ€λ κ΅νλ©λλ€.
const str = "Hello, world!";
const sub = str.substring(7, 12); // "world"
substr(startIndex, length)
: μμ μΈλ±μ€λΆν° μ£Όμ΄μ§ κΈΈμ΄λ§νΌμ λ¬Έμμ΄μ μλ¦
λλ€.
const str = "Hello, world!";
const sub = str.substr(7, 5); // "world"
μ°Έκ³ , κ°μ²΄μμ κ°μ΄ 1μΈ κ°μ²΄μ μΈλ±μ€ ꡬνκΈ°, (map λμ μ¬μ©νλ €κ³ μμλ )
const keysWithValue1 = Object.keys(obj).filter(key => obj[key] === 1).join(', ');