๐ฉ๐ป๐พ
[๋ฐฑ์ค/Python] 12891๋ฒ DNA ๋น๋ฐ๋ฒํธ ๋ณธ๋ฌธ
1๏ธโฃ๋ฌธ์ ์ค๋ช
ํ์์ ๋ฌธ์์ด์ ๊ฐ์ง๊ณ ๋ ธ๋ ๊ฒ์ ์ข์ํ๋ ๋ฏผํธ๋ DNA ๋ฌธ์์ด์ ์๊ฒ ๋์๋ค. DNA ๋ฌธ์์ด์ ๋ชจ๋ ๋ฌธ์์ด์ ๋ฑ์ฅํ๋ ๋ฌธ์๊ฐ {‘A’, ‘C’, ‘G’, ‘T’} ์ธ ๋ฌธ์์ด์ ๋งํ๋ค. ์๋ฅผ ๋ค์ด “ACKA”๋ DNA ๋ฌธ์์ด์ด ์๋์ง๋ง “ACCA”๋ DNA ๋ฌธ์์ด์ด๋ค. ์ด๋ฐ ์ ๋นํ ๋ฌธ์์ด์ ์์ ํ ๋งค๋ฃ๋ ๋ฏผํธ๋ ์์์ DNA ๋ฌธ์์ด์ ๋ง๋ค๊ณ ๋ง๋ค์ด์ง DNA ๋ฌธ์์ด์ ๋ถ๋ถ๋ฌธ์์ด์ ๋น๋ฐ๋ฒํธ๋ก ์ฌ์ฉํ๊ธฐ๋ก ๋ง์๋จน์๋ค.
ํ์ง๋ง ๋ฏผํธ๋ ์ด๋ฌํ ๋ฐฉ๋ฒ์๋ ํฐ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ค. ์์์ DNA ๋ฌธ์์ด์ ๋ถ๋ถ๋ฌธ์์ด์ ๋ฝ์์ ๋ “AAAA”์ ๊ฐ์ด ๋ณด์์ ์ทจ์ฝํ ๋น๋ฐ๋ฒํธ๊ฐ ๋ง๋ค์ด ์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ๋ฏผํธ๋ ๋ถ๋ถ๋ฌธ์์ด์์ ๋ฑ์ฅํ๋ ๋ฌธ์์ ๊ฐ์๊ฐ ํน์ ๊ฐ์ ์ด์์ด์ฌ์ผ ๋น๋ฐ๋ฒํธ๋ก ์ฌ์ฉํ ์ ์๋ค๋ ๊ท์น์ ๋ง๋ค์๋ค.
์์์ DNA๋ฌธ์์ด์ด “AAACCTGCCAA” ์ด๊ณ ๋ฏผํธ๊ฐ ๋ฝ์ ๋ถ๋ถ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ 4๋ผ๊ณ ํ์. ๊ทธ๋ฆฌ๊ณ ๋ถ๋ถ๋ฌธ์์ด์ ‘A’ ๋ 1๊ฐ ์ด์, ‘C’๋ 1๊ฐ ์ด์, ‘G’๋ 1๊ฐ ์ด์, ‘T’๋ 0๊ฐ ์ด์์ด ๋ฑ์ฅํด์ผ ๋น๋ฐ๋ฒํธ๋ก ์ฌ์ฉํ ์ ์๋ค๊ณ ํ์. ์ด๋ “ACCT” ๋ ‘G’ ๊ฐ 1 ๊ฐ ์ด์ ๋ฑ์ฅํด์ผ ํ๋ค๋ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ๋ชปํด ๋น๋ฐ๋ฒํธ๋ก ์ฌ์ฉํ์ง ๋ชปํ๋ค. ํ์ง๋ง “GCCA” ์ ๋ชจ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๊ธฐ ๋๋ฌธ์ ๋น๋ฐ๋ฒํธ๋ก ์ฌ์ฉํ ์ ์๋ค.
๋ฏผํธ๊ฐ ๋ง๋ ์์์ DNA ๋ฌธ์์ด๊ณผ ๋น๋ฐ๋ฒํธ๋ก ์ฌ์ฉํ ๋ถ๋ถ๋ถ์์ด์ ๊ธธ์ด, ๊ทธ๋ฆฌ๊ณ {‘A’, ‘C’, ‘G’, ‘T’} ๊ฐ ๊ฐ๊ฐ ๋ช๋ฒ ์ด์ ๋ฑ์ฅํด์ผ ๋น๋ฐ๋ฒํธ๋ก ์ฌ์ฉํ ์ ์๋์ง ์์๋๋ก ์ฃผ์ด์ก์ ๋ ๋ฏผํธ๊ฐ ๋ง๋ค ์ ์๋ ๋น๋ฐ๋ฒํธ์ ์ข ๋ฅ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์. ๋จ ๋ถ๋ถ๋ฌธ์์ด์ด ๋ฑ์ฅํ๋ ์์น๊ฐ ๋ค๋ฅด๋ค๋ฉด ๋ถ๋ถ๋ฌธ์์ด์ด ๊ฐ๋ค๊ณ ํ๋๋ผ๋ ๋ค๋ฅธ ๋ฌธ์์ด๋ก ์ทจ๊ธํ๋ค.
2๏ธโฃ์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ๋ฏผํธ๊ฐ ์์๋ก ๋ง๋ DNA ๋ฌธ์์ด ๊ธธ์ด |S|์ ๋น๋ฐ๋ฒํธ๋ก ์ฌ์ฉํ ๋ถ๋ถ๋ฌธ์์ด์ ๊ธธ์ด |P| ๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ |P| ≤ |S| ≤ 1,000,000)
๋๋ฒ ์งธ ์ค์๋ ๋ฏผํธ๊ฐ ์์๋ก ๋ง๋ DNA ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค.
์ธ๋ฒ ์งธ ์ค์๋ ๋ถ๋ถ๋ฌธ์์ด์ ํฌํจ๋์ด์ผ ํ {‘A’, ‘C’, ‘G’, ‘T’} ์ ์ต์ ๊ฐ์๊ฐ ๊ณต๋ฐฑ์ ๊ตฌ๋ถ์ผ๋ก ์ฃผ์ด์ง๋ค. ๊ฐ๊ฐ์ ์๋ |S| ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ด ์๋ ์ ์์ด๋ฉฐ ์ด ํฉ์ |S| ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์์ด ๋ณด์ฅ๋๋ค.
3๏ธโฃ์ถ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ๋ฏผํธ๊ฐ ๋ง๋ค ์ ์๋ ๋น๋ฐ๋ฒํธ์ ์ข ๋ฅ์ ์๋ฅผ ์ถ๋ ฅํด๋ผ.
๐ฉ๐ป๐ป์์ฑํ ์ฝ๋
acgt = [0] * 4 # ๋น๋ฐ๋ฒํธ ๊ท์น
slidingList = [0] * 4 # ํ์ฌ ๋ฆฌ์คํธ
cnt = 0 # ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ๋ฌธ์ ๊ฐ์
def slidingadd(c):
global acgt, slidingList, cnt
if c == 'A':
slidingList[0] += 1
if slidingList[0] == acgt[0]:
cnt += 1
elif c == 'C':
slidingList[1] += 1
if slidingList[1] == acgt[1]:
cnt += 1
elif c == 'G':
slidingList[2] += 1
if slidingList[2] == acgt[2]:
cnt += 1
elif c == 'T':
slidingList[3] += 1
if slidingList[3] == acgt[3]:
cnt += 1
def slidingremove(c):
global acgt, slidingList, cnt
if c == 'A':
if slidingList[0] == acgt[0]:
cnt -= 1
slidingList[0] -= 1
elif c == 'C':
if slidingList[1] == acgt[1]:
cnt -= 1
slidingList[1] -= 1
elif c == 'G':
if slidingList[2] == acgt[2]:
cnt -= 1
slidingList[2] -= 1
elif c == 'T':
if slidingList[3] == acgt[3]:
cnt -= 1
slidingList[3] -= 1
s, p = map(int, input().split()) # ๋ฌธ์์ด ํฌ๊ธฐ, ๋ถ๋ถ ๋ฌธ์์ด ํฌ๊ธฐ
str = list(input()) # ์
๋ ฅ ๋ฐ์ ๋ฌธ์์ด
acgt = list(map(int, input().split())) # ๋น๋ฐ๋ฒํธ ๊ท์น
result = 0 # ์ ํจํ ๋น๋ฐ๋ฒํธ ๊ฐ์
for i in range(4):
if acgt[i] == 0:
cnt += 1
for i in range(p):
slidingadd(str[i])
if cnt == 4:
result += 1
for i in range(p, s):
j = i - p
slidingadd(str[i])
slidingremove(str[j])
if cnt == 4:
result += 1
print(result)
๐ก์ฝ๋ ์ค๋ช
์ด ๋ฌธ์ ๋ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐํ๋ ๋ฌธ์ ์ด๋ค.
์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์๊ณ ๋ฆฌ์ฆ์ด๋?
2๊ฐ์ ํฌ์ธํฐ๋ก ๋ฒ์๋ฅผ ์ง์ ํ ๋ค์, ๋ฒ์๋ฅผ ์ ์งํ ์ฑ๋ก ์ด๋ํ๋ฉฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ
ํจ์ slidingadd()๋ ์์ผ๋ก ์ด๋ํ๋ฉฐ ์ถ๊ฐ๋๋ ์๋ก์ด ๊ฐ์ slidingList์ ๋ํด์ฃผ๊ณ ์กฐ๊ฑด์ ๋ฐ๋ผ cnt += 1์,
ํจ์ slidingremove()๋ ์์ผ๋ก ์ด๋ํ๋ฉฐ ์ ์ธ๋๋ ๊ฐ์ slidingList์์ ์ ๊ฑฐํ๊ณ ์กฐ๊ฑด ๋ฐ๋ผ cnt -= 1์ ํด์ค๋ค.
์ฒซ๋ฒ์งธ for๋ฌธ์ ์ฐ์ 'A', 'C', 'G', 'T'์ ์ต์ ๊ฐ์๊ฐ 0์ผ ๋๊ฐ ์๋์ง ํ์ธํ๋ค. ๋ง์ฝ ์ต์ ๊ฐ์๊ฐ 0์ด๋ฉด ์ถฉ์กฑ์ํฌ ์กฐ๊ฑด์ด ์์ผ๋ฏ๋ก cnt += 1์ ํด์ค๋ค.
๋๋ฒ์งธ for๋ฌธ์ ์ ๋ ฅ ๋ฐ์ ๋ฌธ์์ด์ ๋งจ์์์๋ถํฐ ๋ถ๋ถ ๋ฌธ์์ด์ ๊ธธ์ด๋งํผ slidingadd()์ ๋ฃ์ด์ cnt ๊ฐ์ด 4๋ฉด result += 1์ ํด์ฃผ๋ ๊ฒฝ์ฐ๋ค.
์ธ๋ฒ์งธ for๋ฌธ์ ๋งจ ์์์๋ถํฐ ํ์นธ์ฉ ์์ผ๋ก ์ด๋ํ ๋, ์กฐ๊ฑด์ ๋ง์กฑ์ํค๋์ง ๊ฒฝ์ฐ๊ฐ ์๋์ง ํ์ธํ๋ค.
'์ฝ๋ฉํ ์คํธ > ๋ฐฑ์ค(BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/Python] 1874๋ฒ ์คํ์ผ๋ก ์์ด ๋ง๋ค๊ธฐ (0) | 2023.02.05 |
---|---|
[๋ฐฑ์ค/Python] 11003๋ฒ ์ต์๊ฐ ์ฐพ๊ธฐ 1 (0) | 2023.02.05 |
[๋ฐฑ์ค/Python] 1253๋ฒ ์ข์ ์ ๊ตฌํ๊ธฐ (0) | 2023.01.31 |
[๋ฐฑ์ค/Python] 2018๋ฒ ์ฐ์๋ ์์ฐ์์ ํฉ ๊ตฌํ๊ธฐ (0) | 2023.01.29 |
[๋ฐฑ์ค/Python] 10986๋ฒ ๋๋จธ์ง (0) | 2023.01.29 |