코딩테스트/백준

백준-12891(파이썬)

김쓰로그 2022. 10. 2. 19:53

https://www.acmicpc.net/problem/12891

 

12891번: DNA 비밀번호

평소에 문자열을 가지고 노는 것을 좋아하는 민호는 DNA 문자열을 알게 되었다. DNA 문자열은 모든 문자열에 등장하는 문자가 {‘A’, ‘C’, ‘G’, ‘T’} 인 문자열을 말한다. 예를 들어 “ACKA”

www.acmicpc.net

문제생각

 

입력받은 문자열을 슬라이싱하고 개수를 세고 조건을 확인하면 풀리는 간단한 문제라고 생각하고

바로 코드로 옮겼습니다.

 

역시 호락호락한 백준이 아닙니다.ㅎㅎ 바로 시간초과...

 

생각을 해보니 각 문자열은 한칸씩 다음 칸으로 옮겨지는 것이였습니다.

그럼 이전 부분문자열과 다음 부분문잘은 처음과 끝을 제외하고는 가운데 부분은 동일한 문자열인 것입니다.

그러면 굳이 또 문자열을 슬라이싱하고 반복문을 돌릴 필요없이 이전 부분문자열의 첫번째 문자를 빼고 다음 부분문자열의 마지막 문자를 더해주면 되는 것이였습니다.

문제코드

import sys
input=sys.stdin.readline

s, p=map(int, input().split()) #s:DNA문자열 길이, p:부분문자열의 길이
dnaStr=input()
check=list(map(int, input().split()))
ans=0
dic={'A':0, 'C':0, 'G':0, 'T':0}

def checkStr():
    global ans
    if dic['A']>=check[0] and dic['C']>=check[1] and dic['G']>=check[2] and dic['T']>=check[3]:
        ans+=1

temp=dnaStr[0:p] #첫번째 문자열 확인
for i in temp:
    dic[i]+=1
checkStr()

for i in range(1, s-p+1): #두번째부터 마지막까지 문자열 확인
    dic[dnaStr[i-1]]-=1 #이전 문자열의 첫번째 문자 하나 빼기
    dic[dnaStr[i+p-1]]+=1 #다음 문자열의 마지막 문자 하나 더하기
    checkStr() #문자열 확인

print(ans)

 

"아직 실력이 부족하여 문제 해결에 있어 코드가 매끄럽지 못한 점 양해부탁드립니다..ㅎ"