파이썬/코딩테스트

[Do-it 코딩 테스트] 009.DNA 비밀번호(12891)

거북이07 2023. 10. 31. 16:51

문제

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

 

12891번: DNA 비밀번호

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

www.acmicpc.net


코드

내가 작성한 코드

num1, num2 = map(int, input().split())
txt = input()
arr = list(map(int, input().split()))
dic = {'A':0, 'C':0, 'G':0, 'T':0}
count = 0

for i in range(num1 - num2 + 1):
    result = txt[i:num2 + i]
    dic['A'] = result.count("A")
    dic['C'] = result.count("C")
    dic['G'] = result.count("G")
    dic['T'] = result.count("T")

    if dic['A'] >= arr[0] and dic['C'] >= arr[1] and dic['G'] >= arr[2] and dic['T'] >= arr[3]:
        count += 1
print(count)


해석

예제 입력1 예제 출력2
9 8
CCTGGATTG
2 0 1 1
0
예제 입력2 예제 출력2
4 2
GATA
1 0 0 1
2
num1, num2 = map(int, input().split())
txt = input()
arr = list(map(int, input().split()))
dic = {'A':0, 'C':0, 'G':0, 'T':0}
count = 0

사실 내 방법대로 진행하면 위 이미지처럼 코딩테스트에서는 시간초과로  실패하지만... 어느정도 타협하기로했다..

우선 입력값을 받아주기위해 변수를 선언해주고(num1, num2, txt, arr) count를 체크하기위해 초기화가 0인 변수를 선언해주었다.

for i in range(num1 - num2 + 1):
    result = txt[i:num2 + i]
    dic['A'] = result.count("A")
    dic['C'] = result.count("C")
    dic['G'] = result.count("G")
    dic['T'] = result.count("T")

    if dic['A'] >= arr[0] and dic['C'] >= arr[1] and dic['G'] >= arr[2] and dic['T'] >= arr[3]:
        count += 1
print(count)

처음 for문에 반복을 num1 - num2 + 1 로 해주었는데 이유는 예시로 들면

예제2 'GATA' 를 2칸씩 슬라이드
1회 GA
2회 AT
3회 TA
예제1 'CCTGGATTG' 를 8칸씩 슬라이드
1회 CCTGGATT
2회 CTGGATTG

예제 2번은 총 3회 반복, 예제  1번은 총 2번 반복하는것을 확인할 수 있는데. [문자열의 길이 수] - [슬라이스길이] + 1 을 하면 슬라이스 회수가 나오기 때문에 위 식을 입력해주었다.

 

result 값에 입력받은 txt[i:num2 + i]을 넣어주고 미리 만들어놓았던 dic['A'], dic['C'], dic['G'], dic['T'] value 값에 count값을 넣어주고 if 문을 사용하여 모든 조건에 부합할 때 count를 1 올려줄 수 있게 코드를 작성하였다.

 

이렇게하면 답은 맞게 나오나 시간초과가 떠 결과적으로는 실패이다..