본문 바로가기
코딩 테스트/do it! 알고리즘 코딩테스트

009 DNA 비밀번호

by ornni 2024. 4. 15.
728x90
반응형

첫번째 코드

 

라고 말하기도 무색하게... 슬라이딩 윈도우를 써야겠다... 라는 생각을 했는데 어떻게 접근해야할지 몰라서 책을 참고했다.

 

슬라이딩 윈도우에 추가될 때 변화되는 내용 함수

슬라이딩 윈도우에 제거될 때 변화되는 내용 함수

그리고 0일 떄는 신경 쓰지 않아도 되니 맞다고 표시

 

먼저 현재 리스트가 비어있으므로

처음부터 슬리이딩 윈도우 만큼 현재 리스트를 채우고

만약에 현재 리스트와 조건 리스트가 동일하면 check 부분이 4가 되어, 정답에 1을 추가한다.

 

이후부터 숫자 리스트가 끝날때까지 진행

하나 추가, 하나 제거될떄 위의 함수 이용

그리고 현재 리스트와 조건 리스트가 동일하면 check 가 4가 되어 정답에 1추가!

 

 이런 형식으로 진행되는 것이 슬라이딩 위도우이다.

즉 박스만 움직이고 안의 값을 추가하거나 제거하는 것이다.

투포인터와 비슷한데 조금 넓은 범위라고 생각하면 될 듯

 

import sys
input = sys.stdin.readline

need_list = [0]*4
now_list = [0]*4
check = 0

def add_in_list(x):
    global need_list, now_list, check
    
    if x == 'A':
        now_list[0] += 1
        if now_list[0] == need_list[0]:
            check += 1
    
    elif x == 'C':
        now_list[1] += 1
        if now_list[1] == need_list[1]:
            check += 1
    
    elif x == 'G':
        now_list[2] += 1
        if now_list[2] == need_list[2]:
            check += 1
    
    else:
        now_list[3] += 1
        if now_list[3] == need_list[3]:
            check += 1

def remove_in_list(x):
    global need_list, now_list, check
    
    if x == 'A':
        if now_list[0] == need_list[0]:
            check -= 1
        now_list[0] -= 1
    
    elif x == 'C':
        if now_list[1] == need_list[1]:
            check -= 1
        now_list[1] -= 1
        
    elif x == 'G':
        if now_list[2] == need_list[2]:
            check -= 1
        now_list[2] -= 1
    
    else:
        if now_list[3] == need_list[3]:
            check -= 1
        now_list[3] -= 1

s, p = map(int, input().split())
A = list(input())
result = 0
need_list = list(map(int, input().split()))

for i in range(4):
    if need_list[i] == 0:
        check += 1

for i in range(p):
    add_in_list(A[i])
    
if check == 4:
    result += 1

for i in range(p, s):
    j = i - p
    add_in_list(A[i])
    remove_in_list(A[j])
    
    if check == 4:
        result += 1

print(result)
   

 

통과!

 

혼자 풀어보고 싶은데 늘 책을 참고하는 것 같아서 늘고 있는게 맞나.. 확신이 서지 않는다...

나중에 표시해둔 문제들을 다시 풀어보도록 하자!! 또 안되면 또 풀어보면 되지!

늘겟지!!! 처음이니까 괜찮아!!! 라고 생각하자!!!

반응형

'코딩 테스트 > do it! 알고리즘 코딩테스트' 카테고리의 다른 글

012 오큰수  (0) 2024.04.18
010 최솟값 찾기  (0) 2024.04.15
008 좋아  (2) 2024.04.11
007 주몽  (0) 2024.04.11
006 수들의 합 5  (0) 2024.04.08