๐ฉโ๐ป๐ [baekjoon] 12891๋ฒ: DNA ๋น๋ฐ๋ฒํธ
๐๏ธย 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