1. 문제분석 및 접근법
- DNA 문자열 = {A,C,G,T}
- O(nlogn)까지 사용가능
- 투 포인터, 슬라이딩 윈도우 알고리즘 사용
- s, p 입력받음
- 문자열 입력받음
- DNA각 문자 최소 갯수 입력 받음(리스트로 생성)
- 슬라이딩 윈도우로 p만큼 유지하면서 배열 검사
- 각 배열마다 DNA 문자별 배열 만들어서 카운트
- 만족하면 카운트 증가
2. 슈도코드
s, p 입력받기(정수)
dna 입력받기(문자열)
min_dna 입력받기(정수, 리스트)
check_dna 생성 (0,0,0,0 리스트)
check 몇 개를 충족했는지 판단하는 변수 생성
cnt 변수 생성
함수 선언
dna_add(문자 더하기 함수):
check_dna를 최신화 시키고, 조건에 따라 check값 업데이트
dna_remove(문자 빼기 함수):
check_dna에 값을 제거하고 조건에 따라 check값 업데이트
for i-> p~s:
함수를 이용해 유요한 비밀번호인지 판단
결과출력
3. 코드 구현
import sys
input = sys.stdin.readline
s, p = map(int, input().split())
dna = input()
min_dna = list(map(int, input().split()))
check_dna = [0] * 4
check = 0
cnt = 0
def dna_add(x):
global check_dna, check, min_dna
if x == 'A':
check_dna[0] += 1
if check_dna[0] == min_dna[0]:
check += 1
elif x == 'C':
check_dna[1] += 1
if check_dna[1] == min_dna[1]:
check += 1
elif x == 'G':
check_dna[2] += 1
if check_dna[2] == min_dna[2]:
check += 1
elif x == 'T':
check_dna[3] += 1
if check_dna[3] == min_dna[3]:
check += 1
def dna_remove(x):
global check_dna, check, min_dna
if x == 'A':
if check_dna[0] == min_dna[0]:
check -= 1
check_dna[0] -= 1
elif x == 'C':
if check_dna[1] == min_dna[1]:
check -= 1
check_dna[1] -= 1
elif x == 'G':
if check_dna[2] == min_dna[2]:
check -= 1
check_dna[2] -= 1
elif x == 'T':
if check_dna[3] == min_dna[3]:
check -= 1
check_dna[3] -= 1
for i in range(4):
if min_dna[i] == 0:
check += 1
for i in range(p):
dna_add(dna[i])
if check == 4:
cnt += 1
for i in range(p, s):
j = i - p
dna_add(dna[i])
dna_remove(dna[j])
if check == 4:
cnt += 1
print(cnt)