투 포인터 알고리즘은 리스트에 순차적으로 접근해야 할 때 두개 의 점의 위치를 기록하면서 처리하는 알고리즘을 의미한다.
2번부터 7번까지의 학생
이라고 부르곤 한다. 투 포인터를 활용하여 다음과 같은 알고리즘으로 문제를 해결할 수 있다.
1. 시작점(start)과 끝점(end)이 첫 번째 원소의 인덱스(0)를 가리키도록 한다.
2. 현재 부분 합이 M과 같다면 -> 카운트
3. 현재 부분 합이 M보다 작다면 -> end를 1 증가시킨다.
4. 현재 부분 합이 M보다 크거나 같다면 -> start를 1 증가시킨다.
5. 모든 경우를 확인할 때까지 2번부터 4번까지의 과정을 반복한다.
M = 5
[초기 단계] 시작점과 끝점이 첫 번째 원소의 인덱스를 가리키도록 한다
[Step 1] 이전 단계에서의 부분합이 1이었기 때문에 end를 1 증가시킨다
[Step 2] 이전 단계에서의 부분합이 3이었기 때문에 end를 1 증가시킨다
[Step 3] 이전 단계에서의 부분합이 6이었기 때문에 start를 1 증가시킨다
[Step 4] 이전 단계에서의 부분합이 5이었기 때문에 start를 1 증가시킨다
[Step 5] 이전 단계에서의 부분합이 3이었기 때문에 end를 1 증가시킨다
[Step 6] 이전 단계에서의 부분합이 5이었기 때문에 start를 1 증가시킨다
[Step 7] 이전 단계에서의 부분합이 2였기 때문에 end를 1 증가시킨다
[Step 8] 이전 단계에서의 부분합이 7이었기 때문에 start를 1 증가시킨다
import java.util.*;
public class Main {
public static int n = 5; // 데이터 개수
public static int m = 5; //찾고자 하는 부분합
public static int[] arr = {1,2,3,2,5}; // 전체 배열
public static void main(String[] args) {
int cnt = 0;
int intervalSum = 0; // 부분합
int end = 0; // 투 포인터에서 시작점은 순차적으로 for문을 통해 증가시키고 end만 자체적으로 증가시킴!
//start를 차례대로 증가시키며 반복
for (int start = 0; start < n; start++) {
//end를 가능한 만큼 이동시키기
while (intervalSum < m && end < n) { // 부분합이 m보다 작고 끝점이 마지막 인덱스 전이라면
intervalSum += arr[end];
end += 1;
}
//탈출하는 경우는 부분합이 m이상이거나 end가 끝까지 도달했거나 !
// 부분합이 m일 때 카운트 증가
if (intervalSum == m) {
cnt += 1;
}
intervalSum -= arr[start]; // 부분합이 m이든 m을 넘든 시작점 빼고 다시 시작해야지.
}
System.out.println(cnt);
}
}
🛴 구간 합 문제 : 연속적으로 나열된 N개의 수가 있을 때 특정 구간의 수를 합한 값을 계산하는 문제
수행 시간 제한은 O(N + M) 이다.
접두사 합(Prefix Sum)
: 배열의 맨 앞부터 특정 위치까지의 합을 미리 구해 놓은 것
접두사 합을 활용한 알고리즘은 다음과 같다
import java.util.*;
class Main {
public static int n = 5; // 데이터의 개수 N과 데이터 입력받기
public static int arr[] = {10, 20, 30, 40, 50};
public static int[] prefixSum = new int[6];
public static void main(String[] args) {
// 접두사 합(Prefix Sum) 배열 계산
int sumValue = 0;
for (int i = 0; i < n; i++) {
sumValue += arr[i];
prefixSum[i + 1] = sumValue;
}
// 구간 합 계산(세 번째 수부터 네 번째 수까지)
int left = 3;
int right = 4;
System.out.println(prefixSum[right] - prefixSum[left - 1]);
}
}