현재 부분 구간 [0, -1]에서 인덱스가 0인 원소(1)를 추가하면 cur_sum = 0+1 ≤ M(5) 이므로 $r$=0으로 갱신 현재 부분 구간 [0, 0]에서 인덱스가 1인 원소(2)를 추가하면 cur_sum = 1+2 ≤ M(5) 이므로 $r$=1으로 갱신 현재 부분 구간 [0, 1]에서 인덱스가 2인 원소(2)를 추가하면 cur_sum = 3+3 > M(5) 이므로 stop
[2단계] $\small{l}$ = 1 $\small{l}$=1, $r$=1, cur_sum=2, res=0 $\small{l}$이 1이 되면서 인덱스가 0인 원소를 빼줘야 하므로 cur_sum = 3-1 = 2로 시작
현재 부분 구간 [1, 1]에서 인덱스가 2인 원소(3)를 추가하면 cur_sum = 2+3 = M(5) 이므로 $r$=2으로 갱신, res += 1 현재 부분 구간 [1, 2]에서 인덱스가 3인 원소(4)를 추가하면 cur_sum = 5+4 >M(5) 이므로 stop
[3단계] $\small{l}$ = 2 $\small{l}$=2,$r$=2, cur_sum=3, res=1 $\small{l}$이 2가 되면서 인덱수가 1인 원소를 빼줘야 하므로 cur_sum = 5-2 = 3로 시작
현재 부분 구간 [2, 2]에서 인덱스가 3인 원소(4)를 추가하면 cur_sum = 3+4 >M(5) 이므로 stop
[4단계] $\small{l}$ = 3 $\small{l}$=3, $r$=2, cur_sum=0, res=1 $\small{l}$이 3이 되면서 인덱스가 2인 원소를 빼줘야 하므로 cur_sum = 3-3 = 0로 시작
현재 부분 구간 [3, 2]에서 인덱스가 3인 원소(4)를 추가하면 cur_sum = 0+4 ≤ M(5)이므로 $r$=3으로 갱신 현재 부분 구간 [3, 3]에서인덱스가 4인 원소(2)를 추가하면 cur_sum = 4+2 > M(5)이므로 stop
ㆍㆍㆍ
[6단계] $\small{l}$ = 5 $\small{l}$=5, $r$=4, cur_sum=0, res=1 $\small{l}$이 5가 되면서 인덱스가 4인 원소를 빼줘야 하므로 cur_sum = 2-2 = 0로 시작
현재 부분 구간 [5, 4]에서 인덱스가 5인 원소(5)를 추가하면 cur_sum = 0+5 = M(5) 이므로 $r$=2으로 갱신, res += 1 현재 부분 구간 [5, 5]에서 인덱스가 6인 원소(3)를 추가하면 cur_sum = 5+3 > M(5)이므로 stop
[7단계] $\small{l}$ = 6 $\small{l}$=6, $r$=5, cur_sum=0, res=2 $\small{l}$이 6이 되면서 인덱스가 5인 원소를 빼줘야 하므로 cur_sum = 5-5 = 0로 시작
현재 부분 구간 [6, 5]에서 인덱스가 6인 원소(3)를 추가하면 cur_sum = 0+3 ≤ M(5) 이므로$r$=6으로 갱신 현재 부분 구간 [6, 6]에서 인덱스가 7인 원소(1)를 추가하면 cur_sum = 3+1 ≤ M(5) 이므로$r$=7으로 갱신 현재 부분 구간 [6, 7]에서 인덱스가 8인 원소(1)를 추가하면 cur_sum = 4+1 = M(5) 이므로 $r$=8으로 갱신, res += 1 현재 부분 구간 [6, 8]에서 인덱스가 9인 원소(2)를 추가하면 cur_sum = 5+2 > M(5) 이므로 stop
[8단계] $\small{l}$ = 7 $\small{l}$=7, $r$=8, cur_sum=2, res=3 $\small{l}$이 7이 되면서 인덱스가 6인 원소를 빼줘야 하므로 cur_sum = 5-3 = 2로 시작
현재 부분 구간 [7, 8]에서 인덱스가 9인 원소(2)를 추가하면 cur_sum = 2+2 ≤ M(5) 이므로 $r$=9으로 갱신 $r$이 배열의 배열의 끝까지 도달하였으므로 종료!
따라서, 우리는 배열에서 부분 구간의 합이 M(5)인 부분 구간은 res(3)개라는 것을 알 수 있다.
이 풀이는 $\small{l}$과 $r$이 배열의 크기만큼 이동하므로 시간 복잡도는 $O(N)$이다.
따라서, N의 범위가 1 ≤ N ≤ 100,000인 경우에도 사용할 수 있는 풀이라고 할 수 있다.
2. 실제 문제에서 투 포인터 알고리즘
실제 문제에서 투 포인터 알고리즘이 어떻게 쓰이는지 살펴보자.
투 포인터 알고리즘이라 사용하려면 두 개의 포인터가 하나의 상황을 나타낼 수 있어야 한다.
즉, 선형 배열에서는 부분 배열, 2차원 배열에서는 사각형 모양의 구간이라 할 수 있을 것이다.
따라서, 두 개의 포인터가 하나의 상황을 나타낼 수 있는 상황이라면
투 포인터 알고리즘을 이용하여 답의 후보를 조금 더 효율적으로 탐색할 수 있을 것이다.
투 포인터 알고리즘은 문제를 푸는 구체적인 방법론이 아닌 상황을 나타내는 말이므로 여러 문제를 풀며 감을 익히도록 하자.
항상 말하지만, 문제를 알고리즘에 대입하지 말고 '문제를 어떻게 하면 풀 수 있을지'로 접근하는 습관을 들이자!