// education

07. 투 포인터(Two Pointers)와 슬라이딩 윈도우(Sliding Window) - 1차원 배열 $O(N)$ 연속 탐색

1차원 배열 데이터를 효율적으로 탐색하기 위해 두 개의 인덱스 포인터를 조절하는 **투 포인터(Two Pointers)**와 창(Window)을 이동시키는 슬라이딩 윈도우(Sliding Window) 기법을 다룹니다.


4. 실전 파이썬(Python 3) 알고리즘 구현 코드 및 라인별 주석 해설

본 레슨의 핵심 연산 매커니즘을 파이썬 3 환경에서 가장 효율적이고 직관적으로 구현한 실전 소스 코드입니다. 모든 주요 라인마다 상세한 한글 주석이 기재되어 있어 코드의 흐름을 쉽고 명확하게 이해할 수 있습니다.

from collections import deque

# 1. 투 포인터 (Two Pointers - 특정 연속 합 S 구하기)
def count_subarray_sum(arr: list, target: int) -> int:
    """부분 수열의 합이 target인 경우의 수 구하기 (O(N))"""
    count = 0
    current_sum = 0
    right = 0
    
    # left 포인터를 0부터 시작하여 이동
    for left in range(len(arr)):
        # current_sum이 target보다 작은 동안 right 포인터를 전진
        while current_sum < target and right < len(arr):
            current_sum += arr[right]
            right += 1
        # 정확히 target에 도달한 경우 카운트 증가
        if current_sum == target:
            count += 1
        # 다음 left 조사를 위해 현재 left 원소를 뺌
        current_sum -= arr[left]
    return count

# 2. 슬라이딩 윈도우 (Sliding Window - 고정 크기 K 최댓값)
def max_sub_array_of_size_k(arr: list, k: int) -> int:
    """크기 K의 슬라이딩 윈도우 구간 합 중 최댓값 구하기 (O(N))"""
    if len(arr) < k:
        return 0
    # 최초 k개 원소의 합 계산
    window_sum = sum(arr[:k])
    max_val = window_sum
    
    # 윈도우를 한 칸씩 오른쪽으로 이동하며 계산 (O(1) 갱신)
    for i in range(k, len(arr)):
        # 윈도우에 새 원소(arr[i])를 추가하고, 맨 앞 원소(arr[i-k])를 제거
        window_sum += arr[i] - arr[i - k]
        max_val = max(max_val, window_sum)
    return max_val

if __name__ == "__main__":
    nums = [1, 2, 3, 2, 5, 2, 2, 1, 1]
    print("합이 5인 연속 부분 배열 개수:", count_subarray_sum(nums, 5))
    print("크기 3인 윈도우 최대 합:", max_sub_array_of_size_k(nums, 3))

파이썬 소스 코드 핵심 포인트 해설

  1. count_subarray_sum(): 두 개의 인덱스(left, right)를 우측으로 이동시키며 $O(N)$ 선형 타임 조회를 달성합니다.
  2. window_sum += arr[i] - arr[i-k]: 슬라이딩 윈도우의 핵심 매커니즘으로, 맨 앞을 빼고 새 원소를 더해 $O(1)$ 연산으로 윈도우를 갱신합니다.

5. 알고리즘 설계 및 최적화 실무 지침 (Best Practices & Complexity Audit)

07. 투 포인터(Two Pointers)와 슬라이딩 윈도우(Sliding Window) - 1차원 배열 $O(N)$ 연속 탐색 레슨에서 익힌 핵심 알고리즘 메커니즘을 코딩 테스트 및 대규모 웹/서버 엔지니어링 환경에 도입할 때 반드시 체크해야 하는 튜닝 가이드입니다.

1) 공간/시간 복잡도 한계 및 메모리 사용 제어

2) 예외 케이스(Edge Cases) 및 코딩 테스트 체크리스트

  1. 입력 경계값 검증: $N=1$ 이거나 $N=0$ 인 극단적 최소 입력, 혹은 모든 요소의 값이 동일한 경우(Corner Case)에 대한 예외 처리를 누락하지 않습니다.
  2. 무한 루프 및 사이클 감지: 그래프/트리 탐색 시 방문 처리 배열(visited[])의 업데이트 위치를 정확히 지정하여 중복 큐 삽입으로 인한 메모리 초과를 예방합니다.

6. 핵심 요약 및 실무 FAQ (Summary & Q&A)

Q1. 파이썬 코드 주석에서 강조된 성능 핵심은 무엇인가요?

Q2. 실무 개발에서 본 파이썬 알고리즘 패턴은 어디에 활용되나요?

← 이전06. 이분 탐색(Binary Search)과 매개변수 탐색(Parametric Search) - Lower/Upper Bound 다음 →08. 탐욕법(Greedy Algorithm) - 그리디 선택 속성, 회의실 배정 및 분할 배낭 문제