Skip to content

newyumi/hackerrank

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

9 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

javascript array method

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

javascript object method

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 객체 λ©”μ„œλ“œ

Math.max(), Math.min(): μ£Όμ–΄μ§„ 숫자 쀑 κ°€μž₯ 큰 κ°’ λ˜λŠ” μž‘μ€ κ°’ λ°˜ν™˜ν•©λ‹ˆλ‹€. Math.abs(): 숫자의 μ ˆλŒ€κ°’μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€. Math.floor(), Math.ceil(), Math.round(): μ†Œμˆ˜μ  μ΄ν•˜λ₯Ό λ²„λ¦¬κ±°λ‚˜ 올림, λ°˜μ˜¬λ¦Όν•©λ‹ˆλ‹€. Math.random(): 0λΆ€ν„° 1 μ‚¬μ΄μ˜ λ‚œμˆ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

JSμ—μ„œ κ°’ μž…λ ₯μ‹œ

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)μž…λ‹ˆλ‹€. μ΄λŠ” λ°°μ—΄μ˜ 크기에 λŒ€ν•΄ 둜그 μ‹œκ°„μœΌλ‘œ 탐색을 μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— 맀우 νš¨μœ¨μ μž…λ‹ˆλ‹€.

unshift() λ°°μ—΄μ˜ 맨 μ•žμ˜ 값을 μΆ”κ°€

shift() λ°°μ—΄μ˜ 맨 μ•žμ˜ 값을 제거

BFS - Breadth First Search

DFS - Depth First Search

μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ 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λŠ” κ°„μ„  μˆ˜μž…λ‹ˆλ‹€.

효율적인 μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜ 3개

  1. 병합 μ •λ ¬ (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));
}
  1. 퀡 μ •λ ¬ (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)];
}
  1. νž™ μ •λ ¬ (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)λ₯Ό ν•΄κ²°ν•˜λŠ” μ½”λ“œμž…λ‹ˆλ‹€.

ν™œλ™ 선택 문제 (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(', ');

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published