Algorithm
Two Pointer Algorithm
kimyuuum
2020. 11. 11. 13:49
[Two Pointer Algorithm]
직관적으로 보았을 때, O(N^2) 이상으로 해결해야 하는 문제를, O(N)에 해결 가능하다.
조건
연속되는 value들을 이용하여 특정 목표에 맞는 값을 찾아주는 알고리즘.
연속성을 활용하는 것이 특징이다.
주어진 값들을 그대로 활용하거나, 정렬을 통해서 연속성을 추가해줄 수 있는 경우에 사용 가능하다.
Example - 배열의 구간합이 특정 값을 만족해야하는 경우
- 배열의 원소가 모두 양수라면, 구간을 증가시킬 경우 구간합도 증가한다.
만약 계속 커지다가 특정 수를 초과하면?
⇒ left pointer를 증가시킨다.
FLOW
left = 0, right = 0, sum = 0, num = 달성해야 하는 구간 합으로 설정한다.
while(1) 내에서
if(sum ≥ num)
⇒ sum에서 arr[left]를 감소시키고, left idx를 증가시킨다
만약 right가 배열 마지막 idx까지 도달했을 경우 (arr의 size가 n일 경우 n)
⇒ 무한루프를 탈출한다.
if(sum < m)
⇒ right idx를 증가시키고, sum += arr[right]을 실행한다.
left idx를 먼저 체크해주어야 하는 이유
: 2-1과 2-2의 FLOW가 변경될 경우, 그 전 상황에서 right를 증가시켰는데, right가 배열의 끝에 도달했다는 이유만으로 종료시킬 경우, left를 증가시키며 값을 계산할 수 없다.
while(1){
if(sum >= num){
left++;
sum -= arr[left];
}else if(right == n){
break;
}else{
right++;
sum += arr[right];
}
if(sum == num){
//특정 조건 만족
}
}