다중 포인터 패턴

두 개 이상의 포인터(인덱스)를 생성한 후, 특정 조건에 따라 이 포인터들을 서로 다른 방향으로 이동시키면서 문제를 해결

배열이나 문자열 같은 선형 구조나 이중 연결 리스트, 단일 연결 리스트를 만드는 것

한 쌍의 값이나 조건을 충족시키는 무언가를 찾는다. 예시 문제: 정렬된 배열에서 두 숫자의 합이 특정 값과 같은 경우 찾기

// 더하면 0이 되는 쌍을 찾기

sumZero([-3, -2, -1, 0, 1, 2, 3]); // [-3,3]
sumZero([-2, 0, 1, 3]); // undefined
sumZero([1, 2, 3]); // undefined

// 배열이 들어왔을 때 정렬이 되어있어야 효율적임.
// 순진한 접근법

function sumZero(arr) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[i] + arr[j] === 0) {
        return [arr[i], arr[j]];
      }
    }
  }
}
// 시간복잡도 - O(n^2)
// 공간복잡도 - O(1)
// 더 좋은 방법
function sumZero(arr) {
  let left = 0;
  let right = arr.length - 1;
  while (left < right) {
    let sum = arr[left] + arr[right];
    if (sum === 0) {
      return [arr[left], arr[right]];
    } else if (sum > 0) {
      right--;
    } else {
      left++;
    }
  }
}
// 시간복잡도 - O(N)
// 공간복잡도 - O(1)
sumZero([-4, -3, -2, -1, 0, 1, 2, 3, 10]);

Last updated