[알고리즘]다중 포인터 패턴

최정석·2024년 6월 26일
post-thumbnail

정렬되어있는 배열을 받아 두 요소의 합이 0인 요소를 찾아서 리턴해야하는 문제
ex) [-2, -1, 0, 1, 3, 4] => [-1, 1]

  1. for 루프를 중첩해서 배열의 요소를 하나하나 계산하는 방법 O(n^2)
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]]
            }
        }
    }
}
  1. 두개의 포인터를 사용해서 양 끝에서부터 계산하는 방법 O(n)
    두 요소의 합이 0보다 작다면 왼쪽 포인터의 인덱스를 1증가
    합이 0보다 크다면 오른쪽 포인터의 인덱스를 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) {
            left ++
        } else if(sum > 0){
            right --
        }
    }
}

정렬된 배열을 받아들이고 배열의 고유 값을 세는 countUniqueValues라는 함수를 구현합니다. 배열에 음수가 있을 수 있지만 항상 정렬됩니다.
countUniqueValues([1, 1, 1, 1, 1, 2]) // 2
countUniqueValues([1, 2, 3, 4, 4, 4, 7, 7, 12, 12, 13]) // 7
countUniqueValues([]) // 0
countUniqueValues([-2, -1, -1, 0, 1]) // 4

  1. 두 포인터를 인덱스 0, 1로 설정하여 해당 인덱스의 요소가 서로 같을 때 우측 포인터를 1씩 증가시키고 같지 않을 때 좌측 인덱스를 1증가시키고 우측 인덱스의 값을 증가한 좌측 인덱스의 값으로 변경해주는 방법
function countUniqueValues(arr){
    if(arr.length === 0) return 0
    
    let i = 0;
    let j = 1;
  
    while(j < arr.length){
        if(arr[i] === arr[j]){
            j++
        } else {
            i++
            arr[i] = arr[j]
        }
    }
    return i + 1
}

0개의 댓글