chyam

[백준] 12891번, python - DAN 비밀번호 본문

백준

[백준] 12891번, python - DAN 비밀번호

chyam_eun 2025. 9. 7. 15:30

https://www.acmicpc.net/problem/12891

s, p = map(int, input().split())
st = input()
st_cnt = list(map(int, input().split()))  # [A, C, G, T] 최소 요구 개수
res = 0

# 현재 윈도우 문자 개수
cur_cnt = [0, 0, 0, 0]

# 문자 -> 인덱스
idx = {"A": 0, "C": 1, "G": 2, "T": 3}

# 초기 윈도우 채우기
for i in range(p):
    cur_cnt[idx[st[i]]] += 1

# 조건 만족 확인 함수
def check():
    for i in range(4):
        if cur_cnt[i] < st_cnt[i]:
            return False
    return True

if check():
    res += 1

# 슬라이딩 윈도우
for i in range(p, s):
    # 새로 들어온 문자
    cur_cnt[idx[st[i]]] += 1
    # 빠져나간 문자
    cur_cnt[idx[st[i - p]]] -= 1

    if check():
        res += 1

print(res)
# 시간초과 걸린코드. count를 사용해서 시간초과 발생.

s, p = map(int,input().split())
st = input()
st_cnt = list(map(int,input().split()))
res = 0

start, end = 0, p

while end <= s:
    cnt = [st[start:end].count("A"),st[start:end].count("C"),st[start:end].count("G"),st[start:end].count("T")]
    if all(cnt[i] >= st_cnt[i] for i in range(4)):
        res += 1
    start += 1
    end += 1

print(res)