Updated:

๐Ÿ–๏ธย solution

import sys
from collections import Counter, deque

"""
[์‹œ๊ฐ„]
1) 21:30 ~ 22:00

[์š”์•ฝ]
1) DNA ๋ฌธ์ž์—ด: A, C, G, T๋กœ๋งŒ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด
    => DNA ๋ฌธ์ž์—ด์˜ ์ผ๋ถ€๋ฅผ ๋ฝ‘์•„ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ์‚ฌ์šฉ
    => ์ถ”์ถœ ๊ธฐ์ค€์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜๊ฐ€ ํŠน์ • ๊ฐœ์ˆ˜ ์ด์ƒ ๋“ฑ์žฅํ•ด์•ผ ํ•จ
    => ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ์ข…๋ฅ˜, ์ถ”์ถœ๋œ ์œ„์น˜๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋ฌธ์ž์—ด์ด ๊ฐ™์•„๋„ ๋‹ค๋ฅธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ์ทจ๊ธ‰
[์ „๋žต]
1) collections.Counter ์‚ฌ์šฉ
    - ์ฒ˜์Œ ์Šฌ๋ผ์ด๋”ฉ ๋ถ€๋ถ„๊นŒ์ง€๋งŒ ๊ณ„์‚ฐ
"""
S, P = map(int, sys.stdin.readline().split())
dna = sys.stdin.readline().rstrip()
chars = ['A', 'C', 'G', 'T']
result, minimal = 0, {k: v for k, v in zip(chars, list(map(int, sys.stdin.readline().split())))}

counter = Counter(dna[:P])
for i in range(P-1, S):
    if i != P-1:
        counter[dna[i-P]] -= 1
        counter[dna[i]] += 1
    checker = True
    for char in chars:
        if counter[char] < minimal[char]:
            checker = False
            break
    if checker:
        result += 1
print(result)

๐Ÿ’กย idea

  • 1) Sliding Window ์‚ฌ์šฉ
    • ๊ฐœ๋ณ„ ์œˆ๋„์šฐ์— ํฌํ•จ๋œ ์ฒ ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์–ด ๊ธฐ์ค€์น˜๋ฅผ ๋„˜๊ธฐ๋Š”์ง€ ๋Œ€์กฐ
      • Time Complexity ๊ณ ๋ คํ•ด, collections.Counter๋Š” ์ฒ˜์Œ ์œˆ๋„์šฐ์— ํ•œ ๋ฒˆ ์‚ฌ์šฉ
        • Input์ด ๋ฐฑ๋งŒ๊นŒ์ง€๋ผ์„œ ๋ชจ๋“  ์œˆ๋„์šฐ์— Counter ์ ์šฉํ•˜๋ฉด O(n^2)์œผ๋กœ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ
      • ์ดํ›„ ์œˆ๋„์šฐ๋ฅผ ์˜ฎ๊ธฐ๋ฉด์„œ ๋ณ€ํ™”๋˜๋Š” ์ฒ ์ž์˜ ๊ฐœ์ˆ˜๋งŒ ์ˆ˜์ •
        • ๋งจ ์•ž์˜ ์ฒ ์ž์— ๋Œ€ํ•œ ๊ฐœ์ˆ˜๋ฅผ ํ•œ ๊ฐœ ๋นผ์ฃผ๊ณ , ์•ž์œผ๋กœ ์ถ”๊ฐ€๋  ์ฒ ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋Š˜๋ ค์ค€๋‹ค

๋น„๋ฐ€๋ฒˆํ˜ธ๋ผ๊ณ  ํŒ์ •ํ•˜๋Š” ๊ธฐ์ค€์ด ํŠน์ • ์ฒ ์ž์˜ ๊ฐœ์ˆ˜๋ผ๋Š” ์ ์— ์œ ์˜ํ•ด, ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋ฅผ ๋ณ€ํ˜•ํ•˜๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๋˜์ง€ ์•Š๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Leave a comment