포스트

JS 다중 포인터 패턴

jslogo

다중 포인터 패턴 (투 포인터)

  • 선형 자료구조에서 주로 사용된다. (배열, 연결 리스트)
  • 인덱스나 위치에 해당하는 포인터나 값을 만든 다음 , 특정 조건에 따라 중간 지점에서부터 시작, 끝, 양쪽 지점을 향해 이동시키는 것이다.
  • 기본 반복을 사용하면 (이중 루프) O(N^2) 의 시간복잡도를 나타낸다.
  • 올바른 탐색 패턴을 사용하면 O(N)의 시간복잡도를 나타낸다.

예시 문제

주어진 배열에서 두 수의 합이 0 이되는 두 값을 찾아 배열로 반환

테스트 케이스

1
2
3
sumZero([-3,-2,-1,0,1,2,3]) // return [-3,3]
sumZero([-4,-2,0,1,3]) // false
sumZero([-5,-1,0,2,3]) // false

기본 중첩 루프 사용 해답 - O(N^2)

1
2
3
4
5
6
7
8
9
function sumZero_nested(arr) {
  for(let i =0; i<arr.length; i++) {
    for(let j = i+1; j<arr.length; i++) {
      if (arr[i] + arr[j] === 0) {
        return [arr[i], arr[j]]
      }
    }
  }
}

투포인터를 활용한 해결 - O(N)

  • 공간복잡도 : O(1)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    // 패턴을 사용한 해결 : O(N)
    function sumZero_solution(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++;
      }
    }
    }
    

문제 1

  • 정렬된 배열을 받는 함수 countUniqueValues가 있다.
  • 전달된 배열에서 고유한 값의 개수를 세어 반환하는 함수를 작성하라
  • (배열의 요소에는 음의 정수가 있을 수 있다.)
  • (배열은 항상 정렬 되있다.)

테스트 케이스

1
2
3
4
countUniqueValues([1, 1, 1, 1, 1, 2]); // 2개 : 1과 2 두개의 고유값만 존재
countUniqueValues([1, 2, 3, 4, 4, 4, 7, 7, 12, 12, 13]); // 7개
countUniqueValues([]); // 0
countUniqueValues([-2, -1, -1, 0, 1]); // 4개

나의 해답

1
2
3
4
5
6
7
8
9
function countUniqueValues_mine(arr) {
  if(arr.length === 0) {
    return 0;
  } else if (arr.length === 1) {
    return 1;
  }
  const set = new Set(arr);
  return [...set].length;
}
  • Set 자료형을 사용하여 중복을 해결하였다.
  • 찾아보니 Set은 공간복잡도가 높았다.

강의 해답

1
2
3
4
5
6
7
8
9
10
11
function countUniqueValues_solution(arr) {
  //배열을 변환가능한 점을 이용한것
  let i = 0;
  for (let j = 1; j < arr.length; j++) {
    if(arr[i] !== arr[j]) {
      i++;
      arr[i] = arr[j];
    }
  }
  return i+1;
}

배운점

  • Set이라는 자료형을 알게 되었다. 더 알아봐야 한다.
  • Pointer 라는 개념을 두고 위치를 정하여 순회하는 방식이 상당히 합리적이다.
  • 시간복잡도를 계산하는데 아주 조~~~금 익숙해졌다.
  • 공간복잡도는 아직 확실하게 계산 못하겠다.

강의

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.