Krafton Jungle/3. TIL

[WEEK02] Two-pointer 알고리즘

munsik22 2025. 3. 24. 14:24

Two-pointer 알고리즘

 

Two-pointer 알고리즘은 배열이나 리스트와 같은 선형 자료구조에서 두 개의 포인터를 사용하여 문제를 효율적으로 해결하는 기법이다. 일반적으로 정렬된 배열에서 특정 조건을 만족하는 요소를 찾거나, 구간을 조작하는 문제에서 자주 사용된다.

Two-pointer 알고리즘의 유형

(1) 투 포인터 탐색(Two-pointer Search)

  • 두 개의 포인터를 배열의 양 끝에 두고 이동하며 조건을 만족하는 요소를 찾는 방식
  • 예시: 정렬된 배열에서 두 수의 합이 특정 값이 되는 쌍 찾기 (Two Sum 문제)

(2) 슬라이딩 윈도우(Sliding Window)

  • 두 개의 포인터가 일정한 간격을 유지하면서 이동하며 최적의 부분 배열을 찾는 방식
  • 예시: 연속된 부분 배열에서 특정 조건을 만족하는 최대/최소 길이 찾기

Two-pointer 알고리즘의 활용 예제

(1) 두 수의 합 (Two Sum, 정렬된 배열)

# 정렬된 배열에서 두 수의 합이 target이 되는 인덱스 찾기

def two_sum(nums, target):
    left, right = 0, len(nums) - 1
    while left < right:
        current_sum = nums[left] + nums[right]
        if current_sum == target:
            return left, right  # 두 인덱스 반환
        elif current_sum < target:
            left += 1
        else:
            right -= 1
    return None  # 조건을 만족하는 쌍이 없는 경우

(2) 가장 긴 부분 배열 (Sliding Window)

# 주어진 배열에서 합이 target 이하인 가장 긴 부분 배열 찾기

def longest_subarray(nums, target):
    left, current_sum, max_length = 0, 0, 0
    for right in range(len(nums)):
        current_sum += nums[right]
        while current_sum > target:
            current_sum -= nums[left]
            left += 1
        max_length = max(max_length, right - left + 1)
    return max_length

Two-pointer 알고리즘의 장점

  • 시간 복잡도 감소: 일반적으로 O(N^2) 복잡도를 갖는 문제를 O(N)으로 최적화할 수 있음
  • 메모리 효율성: 추가적인 공간을 사용하지 않고 주어진 배열을 직접 탐색
  • 간결한 코드: 반복문과 조건문만으로 간단하게 구현 가능

정리

Two-pointer 알고리즘은 정렬된 배열을 활용하거나 특정 범위를 탐색하는 문제에서 매우 유용하다. 특히 투 포인터 탐색과 슬라이딩 윈도우 기법을 활용하면 다양한 문제를 효과적으로 해결할 수 있다. 실제 코테에서도 자주 등장하는 개념이므로 익숙해질 필요가 있겠다.