개념
두 위치를 이동시키며 조건에 맞는 구간이나 원소 쌍을 찾는 방법입니다. 조건에 따라 어느 포인터를 움직여야 하는지 정합니다.
양수 수열의 연속 구간
모든 원소가 양수이면 오른쪽 끝을 오른쪽으로 옮겨 원소를 추가할 때 합이 커지고, 왼쪽 끝을 오른쪽으로 옮겨 원소를 제거할 때 합이 작아집니다. 합이 목표보다 작으면 오른쪽으로 늘리고, 합이 목표 이상이면 답을 갱신하면서 왼쪽 원소를 제거합니다.
에서 합이 이상인 가장 짧은 구간은 이며 길이는 입니다. 음수가 포함되면 원소를 추가해도 합이 줄거나, 원소를 제거해도 합이 늘 수 있으므로 이 기준을 그대로 적용할 수 없습니다.
앞의 예에서 첫 네 원소 의 합은 입니다. 목표 이상이므로 길이 를 기록하고 맨 앞의 를 제거합니다. 합이 으로 줄면 다시 오른쪽에 원소를 추가합니다. 한 시작점에서 목표를 만족하는 가장 짧은 구간을 확인한 뒤에는, 그 시작점을 유지하며 더 늘려도 길이가 더 길어질 뿐이므로 시작점을 앞으로 옮겨도 됩니다.
정렬된 수열의 두 수
합이 목표인 두 수를 찾을 때는 양 끝에서 시작합니다. 합이 작으면 왼쪽 위치를 오른쪽으로, 합이 크면 오른쪽 위치를 왼쪽으로 옮깁니다. 정렬되어 있으므로 각 이동이 합을 원하는 방향으로 바꿉니다.
정렬된 수열 에서 합 을 찾는다면 양 끝의 합은 입니다. 가장 큰 과 더해도 부족하므로 은 어느 원소와 짝지어도 답이 될 수 없어 왼쪽 포인터를 옮깁니다. 다음 합 은 너무 큽니다. 현재 남은 가장 작은 과 더해도 크므로 을 제외합니다. 이런 근거로 한쪽씩 제외하면 모든 쌍을 비교하지 않고도 답을 찾을 수 있습니다.
복잡도
원소 수를 이라고 합니다. 두 포인터가 각각 앞으로 최대 번 이동합니다.
| 연산 | 시간복잡도 | 공간복잡도 |
|---|---|---|
| 조건을 만족하는 최소 구간 탐색 | 입력 , 추가 |
예제
문제
합이 이상인 연속 구간 중 가장 짧은 길이를 구하여라.
입력
첫째 줄에 원소 수 과 목표 합 가 공백을 사이에 두고 주어진다. ; 이다.
둘째 줄에 수열의 원소 이 공백을 사이에 두고 주어진다. 이다.
출력
최소 길이를 출력한다. 조건을 만족하는 구간이 없으면 을 출력한다.