BOJ/Python

백준 12891번 DNA 비밀번호 파이썬

띵지니어 2023. 2. 14. 23:07
반응형

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())
DNA = input().rstrip()
DNA_dict = {'A': 0, 'C': 1, 'G': 2, 'T': 3}
ACGT = list(map(int, input().split()))
result = 0

start_index = 0
end_index = P - 1

check_list = [0, 0, 0, 0]
for i, j in enumerate('ACGT'): 
    check_list[i] = DNA[start_index: end_index + 1].count(j)


while S > end_index:

    start_index += 1
    end_index += 1

    if (ACGT[0] <= check_list[0] and ACGT[1] <= check_list[1] and ACGT[2] <= check_list[2] and ACGT[3] <= check_list[3]):
        result += 1

    check_list[DNA_dict[DNA[start_index - 1]]] -= 1
    try:
        check_list[DNA_dict[DNA[end_index]]] += 1
    except:
        continue

print(result)

Review

 

결론은 시간 복잡도 이슈로 인해 투포인터 방식으로 문제를 풀었다.

핵심은 check_list 를 만들어서 주어진 최소개수를 만족하는가에 초점을 두었다.

간단하게 나타낸다면 아래 사진 처럼 나타 낼 수 있다.


 

예제 입력으로 그림을 그려 설명을 하자면

# 예제 입력 2

4 2
GATA
1 0 0 1

코드 과정

 

 

* 코드에 예외 처리를 한 이유는 마지막 연산에서 Out-Of-Index 에러를 방지하기 위해서 예외를 하였다.

예외처리


 

처음에는 O(N^2) 으로 코드를 짰었다.

코드가 N^2 인것만 확인 하자!

# 시간초과 코드

import sys

input = sys.stdin.readline

S, P = map(int,input().split())
DNA = input().rstrip()
ACGT = list(map(int, input().split()))
result = 0

start_index = 0
end_index = P-1

while S-1 >= end_index:
    
    check_list = [0, 0, 0, 0]
    
    for i in range(start_index, end_index + 1):
        if DNA[i] == 'A':
            check_list[0] += 1
        elif DNA[i] == 'C':
            check_list[1] += 1
        elif DNA[i] == 'G':
            check_list[2] += 1
        elif DNA[i] == 'T':
            check_list[3] += 1
            
    if (ACGT[0] <= check_list[0] and ACGT[1] <= check_list[1] and ACGT[2] <= check_list[2] and ACGT[3] <= check_list[3]):
        result += 1
        
    start_index += 1
    end_index += 1
    
print(result)

반응형
목차(index)