https://www.acmicpc.net/problem/12891
0~P까지의 문자 비교
1~P+1 문자 비교
2~P+2 문자 비교
를 해야하므로 위와 같은 슬라이딩 윈도우 과정을 거친다.
문자를 비교하는 방법은 A,G,C,T 만 사용하므로
각각을 알파벳 순서에 맞춰 (0부터 시작)
A : 0
B
C : 2
D E F
G : 6
H I J K L M N O P Q R S
T : 19
로도 구분할 수 있다.
따라서 int[20] 배열을 생성한 후,
각각 들어오는 문자열에 맞춰 0~P 까지의 문자를 확인하며 int[현재문자] ++ ; 을 해준다.
ex) AACA = int[0] = 3 ,int[2] = 1
위 과정이 P번 이루어지면 비밀번호로 사용할 수 있는 지 확인해야 한다.
그건 int[] 배열에 담긴 현재 문자열의 정보와, 문제에서 주어진 최소A,C,G,T 사용 개수와 비교하여 true OR false 를 반환한다!
import java.io.*;
import java.util.*;
public class Main{
static int S, P ;
static char[] DNAstr;
static int[] DNAnums = new int[20] ; // 0 ="A", 1="C", 6="G", 19="T"
static int minA, minC, minG , minT ;
public static int stoi(String str){
return Integer.parseInt(str);
}
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
S = stoi(st.nextToken()); //DNA문자열 길이
P = stoi(st.nextToken()); //부분문자열 길이
DNAstr = br.readLine().toCharArray(); // 문자열 입력
// 사용가능한 A,C,G,T 개수 입력받기
st = new StringTokenizer(br.readLine());
minA = stoi(st.nextToken());
minC = stoi(st.nextToken());
minG = stoi(st.nextToken());
minT = stoi(st.nextToken());
System.out.println(Sliding());
}
public static int Sliding(){
int count = 0 ;
int start = 0 ; // 시작지점
int end = P; //끝지점
for(int i=0;i<P;i++){ //P 길이만큼
int nowStr = DNAstr[i]-'A'; // 현재 문자
DNAnums[nowStr] ++ ;
}
if(CheckStr()) count ++ ;
for(int i=P;i<S;i++){
int befStr = DNAstr[i-P]-'A'; // 이전 문자
DNAnums[befStr] -- ;
int nowStr = DNAstr[i]-'A'; // 현재 문자
DNAnums[nowStr] ++ ;
if(CheckStr()) count ++ ;
}
return count ;
}
public static boolean CheckStr(){
// DNAnums A C G T
if(DNAnums[0] >= minA && DNAnums[2] >= minC && DNAnums[6]>=minG && DNAnums[19]>=minT) return true ;
else return false ;
}
}