Python study/Rosalind

[Rosalind] BA1A - Compute the Number of Times a Pattern Appears in a Text

김쿼드 2022. 8. 2. 16:02

BA1A - Compute the Number of Times a Pattern Appears in a Text

* 문제 링크 :  https://rosalind.info/problems/ba1a/

 


 

첫 문제라서 그런가 슈도코드로 힌트를 주고 시작합니다. 가볍게 살펴볼까요.

 

PatternCount(Text, Pattern)
        count ← 0
        for i ← 0 to |Text| − |Pattern|
            if Text(i, |Pattern|) = Pattern
                count ← count + 1
        return count

 

특정 Pattern이 주어질 시, 해당 Pattern이 Text에서 몇 번 확인되는지에 대한 내용입니다. 단순히 for 루프 안에다가 if 문을 두어 비교하면 되는 쉬운 문제입니다.

 

import pandas as pd
file = pd.read_table("../../Downloads/rosalind_ba1a.txt", header= None)

 

Rosalind는 파일을 받은 뒤에 답안을 따로 적거나 다시 업로드해야 되는 방식입니다. 그래서 그냥 편의를 위해 pandas를 적용해서 불러왔습니다. file 변수로 파일을 불러오게 되면, file[0][0]에는 Text가, file[0][1]에는 Pattern이 남게 됩니다.

 

file[0][0]
'GGAGTTAATAGTTAATGAGTCATCAGTTAATAGTTAATGCGAGTTAATAAGTTAATGAGTTAATTAGTGGGTCTCAGTTAATGTTAAGTTAATAGTTAATTCAAAAGTTAATCAGTTAATGATGGACGTCAGTTAATGTGGGTTATAGTTAATGTTAGTTAATGTCAGTTAATAGTTAATAGTTAATGCCAGTTAATTGGAGTTAATAGTTAATCAGTTAATGGGAAAAGTTAATGAACCTAGTTAATAAGTTAATAGTTAATGGATAGTTAATAGTTAATTAAGTTAATACATAAAGTTAATGCTCAAAGTTAATAGTTAATCAGCAGTTAATCGCAAGTTAATAGTTAATTAGTTAATTAAGTTAATAGTTAATGCTTAAGTTAATAGTTAATAGTTAATGAAAGTTAATAGTTAATTAGTGAGTTAATATTAGTTAATAGTTAATTGGAGTTAATGAGTTAATAGCTGCCCTAGTTAATAGTTAATATGAGTTAATAGTTAATGACAAGTTAATAGTTAATTTAGTTAATATCAGTTAATATAGTTAATAGTTAATTTAGTTAATGGAAGTTAATAGTTAATAGTTAATCAGTAGTTAATTGTGAGTTAATCCGATTAGTTAATTTCTGGACAAGCATGAAGTTAATGAGTTAATAGTTAATGAGTTAATCAGTTAATAACACAGAGTTAATCAGTTAATATAGTTAATAGACAGTTAATAGTTAATCTAGTTAATAAGTTAATTCGTCGAAGTTAATAGTTAATAGTTAATGTCAGTTAATGACAGAAAGTTAATGTAGTTAATCAAGTTAATTCTCAGTTAATCGGGGAGTTAATAGTTAATTGCCGAGTTAATAGTTAATGCTAGTTAATATTCAGTTAATAGTTAATTTGTAATTGACAAAGTTAATAGTTAATCCCAGTTAATGTCCAAGTTAATAGTTAATATGAGTTAATAGGACTAGTTAATAGTTAATAGTTAATGAGTTAATCAGTTAATCAGTTAATAGTTAATAGCTAAAAAATCAGTTAATAGTTAATATCGGCGTTAGTTAAT'

 

그 다음으로 슈도코드에 맞게 파이썬으로 다시 함수를 작성해 줍니다.

 

def PatternCount(Text, Pattern):
    count = 0
    for i in range(len(Text)-len(Pattern)):
        if Text[i : i+len(Pattern)] == Pattern :
            count += 1
    return count

 

if문을 돌리면서 슬라이싱된 Text가 Pattern과 일치하는 지 확인하고, 그 경우에 맞게 count를 올려주면 됩니다.

 

PatternCount(file[0][0], file[0][1])
38

 

좋아요. 초반이라 아직까지는 할만하네요. 다음 문제로 넘어가 봅니다.