백준 12891[DNA 비밀번호]

Ju_Nik_e·2023년 5월 2일
0

baekjoon

목록 보기
10/16

1. 문제분석 및 접근법

  • DNA 문자열 = {A,C,G,T}
  • O(nlogn)까지 사용가능
  • 투 포인터, 슬라이딩 윈도우 알고리즘 사용
  1. s, p 입력받음
  2. 문자열 입력받음
  3. DNA각 문자 최소 갯수 입력 받음(리스트로 생성)
  4. 슬라이딩 윈도우로 p만큼 유지하면서 배열 검사
  5. 각 배열마다 DNA 문자별 배열 만들어서 카운트
  6. 만족하면 카운트 증가

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)

0개의 댓글