알고리즘 문제풀이

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)