발행일

코딩 테스트 개요 및 문제 풀이를 위한 자바스크립트 문법 05

코딩 테스트 개요 및 문제 풀이를 위한 자바스크립트 문법 05

이 글은 네이버 블로그에 2024년 2월 4일에 올렸던 것을 그대로 옮겨온 것입니다.

투포인터 알고리즘 (Two Pointer Algorithm)

투포인터 알고리즘은 주로 배열이나 리스트에서 두 개의 포인터를 이용하여 문제를 해결하는 방법입니다. 이 알고리즘은 주로 정렬된 배열에서 두 수의 합, 최대 부분합, 연속된 데이터의 특징을 찾을 때 유용합니다.

기본 개념: 배열이 정렬되어 있다고 가정할 때, 시작점과 끝점 두 포인터를 이용해 범위를 조정하면서 문제를 해결합니다.

예제: 주어진 배열에서 합이 특정 값에 해당하는 두 요소의 인덱스를 찾는 문제

function twoPointer(arr, target) {
  let start = 0;
  let end = arr.length - 1;

  while (start < end) {
    let sum = arr[start] + arr[end];

    if (sum === target) {
      return [start, end];
    } else if (sum < target) {
      start++;
    } else {
      end--;
    }
  }

  return [-1, -1]; // 찾지 못했을 때
}

다이나믹 프로그래밍 (Dynamic Programming)

다이나믹 프로그래밍은 복잡한 문제를 여러 개의 작은 문제로 나누어 해결하는 방법입니다. 각 작은 문제의 결과를 저장해두고, 이를 이용하여 큰 문제를 해결합니다. 이 방법은 중복된 계산을 줄이기 때문에 많은 문제를 더 빠르게 해결할 수 있게 해줍니다.

기본 개념: 큰 문제를 작은 문제로 나누고, 작은 문제의 해답을 저장해 두었다가 재사용합니다.

예제: 피보나치 수열

function fibonacci(n, memo = {}) {
  if (n in memo) return memo[n];
  if (n <= 2) return 1;

  memo[n] = fibonacci(n - 1, memo) + fibonacci(n - 2, memo);
  return memo[n];
}

누적합 알고리즘 (Prefix Sum Algorithm)

누적합 알고리즘은 배열의 특정 구간의 합을 빠르게 구할 수 있는 방법입니다. 이를 위해 배열의 시작부터 각 위치까지의 합을 저장하는 새로운 배열을 만듭니다. 이후 구간의 합은 이 배열을 이용하여 쉽게 구할 수 있습니다.

기본 개념: 배열의 각 위치까지의 합을 미리 계산해두고, 이를 이용하여 구간의 합을 빠르게 구합니다.

예제: 배열에서 구간 [i, j]의 합을 구하는 문제

function prefixSum(arr) {
  let prefixSumArray = Array(arr.length).fill(0);
  prefixSumArray[0] = arr[0];

  for (let i = 1; i < arr.length; i++) {
    prefixSumArray[i] = prefixSumArray[i - 1] + arr[i];
  }

  return prefixSumArray;
}

function rangeSum(prefixSumArray, i, j) {
  if (i === 0) return prefixSumArray[j];
  return prefixSumArray[j] - prefixSumArray[i - 1];
}