알고리즘 문제풀이
DNA 비밀번호(백준 12891)
wiojfe
2024. 3. 18. 14:41
https://www.acmicpc.net/problem/12891
12891번: DNA 비밀번호
평소에 문자열을 가지고 노는 것을 좋아하는 민호는 DNA 문자열을 알게 되었다. DNA 문자열은 모든 문자열에 등장하는 문자가 {‘A’, ‘C’, ‘G’, ‘T’} 인 문자열을 말한다. 예를 들어 “ACKA”
www.acmicpc.net
문자열에서 한 칸씩 오른쪽으로 이동하며 주어진 조건을 충족하는 지 확인한다.
n, m = map(int, input().split())
string = input().rstrip()
a, c, g, t = map(int, input().split())
target_dict = {'A': a, 'C': c, 'G': g, 'T': t}
# 현재 윈도우에서 각 문자의 빈도를 추적할 딕셔너리
current_dict = {'A': 0, 'C': 0, 'G': 0, 'T': 0}
# 초기 윈도우 설정
for i in range(m):
current_dict[string[i]] += 1
ans = 0
# 빈도수 조건을 만족하는지 확인하는 함수
def is_satisfied(cur_dict, tar_dict):
for key in tar_dict:
if cur_dict[key] < tar_dict[key]:
return False
return True
# 초기 윈도우가 목표하는 빈도를 넘는지 확인
if is_satisfied(current_dict, target_dict):
ans += 1
# 슬라이딩 윈도우를 이동하면서 확인
for i in range(1, n - m + 1):
# 이전 윈도우의 첫 번째 문자 빈도 감소
current_dict[string[i - 1]] -= 1
# 새로운 윈도우의 마지막 문자 빈도 증가
current_dict[string[i + m - 1]] += 1
# 현재 윈도우가 목표하는 빈도를 넘는지 확인
if is_satisfied(current_dict, target_dict):
ans += 1
print(ans)