개발/👾 PS
[슬라이딩 윈도우] 알고리즘
정소은
2023. 3. 15. 03:47
1. 개념
슬라이딩 윈도우 : 투 포인터를 이용해 범위를 지정해주고 지정된 범위를 옮겨가면서 문제를 해결하는 알고리즘
* 지정된 범위 : window 옮기기 : sliding
2. 문제 풀이
# 1 DNA 비밀번호 - 백준 12891번
https://www.acmicpc.net/problem/12891
12891번: DNA 비밀번호
평소에 문자열을 가지고 노는 것을 좋아하는 민호는 DNA 문자열을 알게 되었다. DNA 문자열은 모든 문자열에 등장하는 문자가 {‘A’, ‘C’, ‘G’, ‘T’} 인 문자열을 말한다. 예를 들어 “ACKA”
www.acmicpc.net
import sys
input = sys.stdin.readline
ans = [0] * 4
now = [0] * 4
# 윈도우 옮길 때 추가되는 원소의 now값 +1
def plus(end):
global cnt, now, ans
if end == "A":
now[0] += 1
elif end == "C":
now[1] += 1
elif end == "G":
now[2] += 1
elif end == "T":
now[3] += 1
# 윈도우 옮길 때 빠지는 원소의 now값 -1
def minus(start):
global cnt, now, ans
if start == "A":
now[0] -= 1
elif start == "C":
now[1] -= 1
elif start == "G":
now[2] -= 1
elif start == "T":
now[3] -= 1
s,p = map(int,input().split())
dna = list(input())
ans = list(map(int,input().split()))
start = 0
end = p-1
result = 0
# 초기 윈도우의 now 값
for i in range(p):
plus(dna[i])
# now의 모든 값이 ans의 모든 값보다 크거나 같을 때 result +1
if now[0]>=ans[0] and now[1]>=ans[1] and now[2]>=ans[2] and now[3]>=ans[3]:
result += 1
# 윈도우 한 칸씩 옮기기
while end <= s-2:
minus(dna[start])
start += 1
end += 1
plus(dna[end])
# now의 모든 값이 ans의 모든 값보다 크거나 같을 때 result +1
if now[0]>=ans[0] and now[1]>=ans[1] and now[2]>=ans[2] and now[3]>=ans[3]:
result += 1
print(result)
# 2 최솟값 찾기 1 - 백준 11003번
https://www.acmicpc.net/problem/11003
11003번: 최솟값 찾기
N개의 수 A1, A2, ..., AN과 L이 주어진다. Di = Ai-L+1 ~ Ai 중의 최솟값이라고 할 때, D에 저장된 수를 출력하는 프로그램을 작성하시오. 이때, i ≤ 0 인 Ai는 무시하고 D를 구해야 한다.
www.acmicpc.net
이건 아직 무리인 듯하다..