[알고리즘] 다중 포인터 (Multiple Pointers)


1. 다중 포인터 (Multiple Pointers)

해당하는 Index에 해당하는 포인터나 값을 만든 다음 특정 조건에 따라 중간 지점에서 부터 시작, 끝, 양쪽 지점을 향해 이동

문제 설명

  • 정렬된 정수의 배열을 인자로 받아 그 배열 안에서 두 원소의 합이 0가 되는 첫 번째 수열을 반환하는 함수.(선형 구조 , 이중 연결 리스트 , 단일 연결 리스트)

입출력 예

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


2. My Solution

1) 기본 접근법

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(n2) : 중첩 루프로 인한 시간복잡도 효율성 저하



3. Refactored Solution

1) 두개의 포인터로 While 반복문 실행

function sumZero(arr) {
  //왼쪽 인덱스 포인터 지정
  let left = 0;
  //오른쪽 인덱스 포인터 지정
  let right = arr.length - 1;
  //while문 설정 조건은 왼쪽이 오른쪽보다 크다.
  //만약 조건문이 참이라면, while문 안의 문장들이 실행된다. 거짓이라면, 문장은 그냥 while 반복문 후로 넘어간다.
  while (left < right) {
    //합계지정
    let sum = arr[left] + arr[right];
    if (sum === 0) {
      return [arr[left], arr[right]];
    } else if (sum > 0) {
      right--;
    } else {
      left++;
    }
  }
}

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

시간 복잡도 O(N) : 두개의 포인터를 사용한다

공간 복잡도 O(1)