슬라이딩 윈도우 알고리즘이란
1,2,3,4,5 라는 숫자 배열이 있다.
이 안에서 A[i] + A[i+1] + A[i+2]라는 형식으로 연속적인 3개의 숫자 합을 구하려고 한다.
[1,2,3],4,5 / 1,[2,3,4],5 / 1,2,[3,4,5]
이런 식으로 창문이 창틀을 따라서 미끄러지듯 일정한 크기의 윈도우가 틀을 만들어 이동하는 것을 볼 수 있다.
이러한 특성으로 인해, 크기가 n인 연속된 부분 합을 구하는 경우 자주 사용된다.
투 포인터와 슬라이딩 윈도우의 차이
두 알고리즘은 모두 부분 배열의 합(prefix sum)을 구하는 데 유용하게 사용된다.
투 포인터
- 구간의 길이를 가변적으로 잡는다.
- 구간의 양쪽 끝이 되는 포인터가 두 개 필요하다.(시작, 끝)
슬라이딩 윈도우
- 합을 구할 부분집합의 개수가 정해져있다. = 구간의 길이가 정해져있다.
- 포인터가 두 개일 필요가 없다.
주요 코드
num =[ 1,2,3,4,5]
k = 3
window = sum(num[:k])
answer = window
for i in range(3, n):
window = window +num[i] - num[i-k]
answer = max(window, answer)
num이라는 숫자 배열이 있다고 할 때, 3까지의 고정 틀 안의 숫자들을 합해놓는다. 그리고 이 window를 천천히 뒤로 하나씩 움직이면서 연산을 진행할 것이다.
3까지 이미 계산해놓았으니, for문은 4번째 자리(num[3])부터 시작한다.
그리고 한칸씩 뒤로 가면서 i번째 수는 더해주고, i-k번째 수는 빼주는 식으로 진행한다.
이렇게 진행하면 배열에서의 가장 큰 부분합을 구할 수 있다.
관련 문제
문제집
문제집: 슬라이딩윈도우/투포인터 (haru8986)
www.acmicpc.net
https://www.acmicpc.net/problem/2003
2003번: 수들의 합 2
첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.
www.acmicpc.net
https://www.acmicpc.net/problem/12891
12891번: DNA 비밀번호
평소에 문자열을 가지고 노는 것을 좋아하는 민호는 DNA 문자열을 알게 되었다. DNA 문자열은 모든 문자열에 등장하는 문자가 {‘A’, ‘C’, ‘G’, ‘T’} 인 문자열을 말한다. 예를 들어 “ACKA”
www.acmicpc.net
https://www.acmicpc.net/problem/3078
3078번: 좋은 친구
첫째 줄에 N과 K가 주어진다. (3 ≤ N ≤ 300,000, 1 ≤ K ≤ N) 다음 N개 줄에는 상근이네 반 학생의 이름이 성적순으로 주어진다. 이름은 알파벳 대문자로 이루어져 있고, 2글자 ~ 20글자이다.
www.acmicpc.net
'코딩테스트 대비 > 알고리즘' 카테고리의 다른 글
| Kruskal 알고리즘(MST) / Union-Find (0) | 2023.10.05 |
|---|---|
| 플로이드 워셜 알고리즘(Floyd Warshall) (0) | 2023.07.26 |
| [Python] 최소공배수, 최대공약수 파이썬으로 구현하기(유클리드 호제법) (0) | 2023.07.11 |
| [자료구조] 힙(Heap) / 우선순위 큐(PriorityQueue) 파이썬으로 구현하기 (0) | 2023.07.10 |
| [Python] 소수 찾기 알고리즘(에라토스테네스의 체) (0) | 2023.07.05 |