[알고리즘] 구간 합 / 투 포인터 / 슬라이딩 윈도우

구간 합 (Prefix sum)

  • 합 배열을 이용하여 시간 복잡도를 더 줄이기 위해 사용하는 특수한 목적의 알고리즘
  • 코딩 테스트에서 사용 빈도가 높으니 잘 알아둘 것!!
// 배열 A. 합 배열 S
S[i] = A[0] + A[1] + ... + A[i-1] + A[i]; // A[0]부터 A[i]까지의 합

// 합 배열 S 만드는 공식
S[i] = S[i-1] + A[i];

// 구간 합을 구하는 공식
S[j] - S[i-1]; // i에서 j까지 구간 합


// 2차원일 경우 S[i][j]의 값을 채우는 구간 합 공ㅇ식
S[i][j] = S[i][j-1] + S[i-1][j] - S[i-1][j-1] + A[i][j];

투 포인터 (Two Pointers)

  • 2개의 포인터로 알고리즘의 시간복잡도를 최적화
  • 연속되고 길이가 가변적인 "부분 연속 " 리스트에 사용
  • 시간 복잡도 O(N)으로 처리 가능
  • 유형
    • 2개의 포인터 변수 시작점이 배열의 시작점인 경우
    • 정렬된 배열 안에서 2개의 포인터 변수가 각각 시작점과 끝점에 위치한 경우
  • 부분배열의 합이 Target값보다 크거나 같을 경우 Start ++
    • 같은 경우 count++
  • 부분배열의 합이 Target값보다 작을 경우 End ++

// 투 포인터 이동 원칙
sum > N : sum = sum - start; start++;
sum < N : end++; sum = sum + end;
sum == N : end++; sum = ssum + end; count++

슬라이딩 윈도우 (Sliding Window)

  • 연속되고 길이가 고정적인 "부분 연속 " 리스트에 사용
  • 시간 복잡도 O(N)으로 처리 가능


투 포인터와 슬라이딩 윈도우

  • 공통점
    • 1차원 배열을 부분 배열을 활용하여 시간복잡도를 O(N)으로 줄일 수 있음
  • 차이점
    • 투 포인터는 길이가 가변적인 반면, 슬라이딩 윈도우는 길이가 고정
    • 투 포인터는 2개의 포인터 변수가 필요한 반면, 슬라이딩 윈도우는 고정길이이기 때문에 1개의 포인터 변수만 있으면 됨

BELATED ARTICLES

more