๐Ÿ‘ฉ๐Ÿป‍๐ŸŒพ

[๋ฐฑ์ค€/Python] 12891๋ฒˆ DNA ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณธ๋ฌธ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ/๋ฐฑ์ค€(BOJ)

[๋ฐฑ์ค€/Python] 12891๋ฒˆ DNA ๋น„๋ฐ€๋ฒˆํ˜ธ

์ฅฌ์Šค์ด 2023. 2. 3. 00:02
728x90

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๋ฌธ์€ ๋งจ ์•ž์—์„œ๋ถ€ํ„ฐ ํ•œ์นธ์”ฉ ์˜†์œผ๋กœ ์ด๋™ํ•  ๋•Œ, ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ค๋Š”์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

728x90
Comments