모든 사진 자료에 관한 출처는 아래 알튜비튜 - 튜터링에 있음을 밝힙니다.
https://github.com/Altu-Bitu/Notice
이런 문제가 있다고 해봅시다!
더할때마다 시간 복잡도 O(n)
만약 배열의 크기가 10,000 이라면 구하고자하는 구간이 1,000,000개만 돼도 총 연산횟수 100억!
A[i] ~ A[j]까지의 합 = sum[j] -sum[i-1]
그렇다면 j-i
가 고정된 상태, 즉 구해야하는 구간이 일정한 상태에서
누적합을 사용하지 않고 구간합을 빠르게 구하는 방법은?
정렬이 됐다고 가정하면 맨 왼쪽에는 가장 작은 값이 존재, 맨 오른쪽에는 가장 큰 값이 존재한다. 오른쪽으로 갈 수 록 값이 커지고, 왼쪽으로 갈 수록 값이 작아진다.
종료조건 : left < right
(left는 항상 right의 왼쪽에 있어야 함 -> left right가 같아지면 하나의 용액을 사용하게 되기 때문)
-> 에라토스테네스의 체를 이용해 연속된 소수를 연속된 배열의 원소로 넣자! 그리고 같은방향으로 탐색하는 두개의 포인터 활용!
Q. 둘다 한칸씩 옮기는 이유?
A. Left만 오른쪽으로 옮기면 목표값(41)보다 작아져서 Right를 옮기게됨. Right만 오른쪽으로 옮기면 목표값(41)보다 커져서 Left를 옮기게 됨.
즉. left ->right, right->left 과정이 필연적으로 뒤따르므로 한꺼번에 처리하는것.
종료 조건 :left <= right && right < size
(left는 항상 right의 왼쪽 또는 같은 위치에 있어야 함)
같은 방향으로 탐색하는 두개의 포인터를 활용하자!
종료 조건 :left <= right && right < size
(left는 항상 right의 왼쪽 또는 같은 위치에 있어야 함)