Playground/자바문제집
[백준] 12891번
미숫가루설탕많이
2023. 4. 5. 10:27
public class Main {
static int[] checkArr; // 비밀번호를 체크할 배열
static int[] myArr; // 현재 상태 배열
static int checkSecret; // 몇 개의 문자가 충족하는지 확인할 변수
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int S = Integer.parseInt(st.nextToken()); // 문자열 크기
int P = Integer.parseInt(st.nextToken()); // 부분 문자열 크기
char[] A = new char[S]; // 문자열 데이터
int result = 0;
checkArr = new int[4];
myArr = new int[4];
checkSecret = 0;
A = br.readLine().toCharArray();
st = new StringTokenizer(br.readLine());
for (int i = 0; i < 4; i++) {
checkArr[i] = Integer.parseInt(st.nextToken());
if (checkArr[i] == 0) {
checkSecret++; // 체크하지 않아도 충족하기 때문에 ++
}
}
for (int i = 0; i < P; i++) {
add(A[i]);
}
if (checkSecret == 4) result++;
for (int i = P; i < S; i++) {
int j = i - P;
add(A[i]);
remove(A[j]);
if (checkSecret == 4) result++;
}
System.out.println(result);
br.close();
}
private static void add(char ch) {
switch (ch) {
case 'A':
myArr[0]++;
if (myArr[0] == checkArr[0]) checkSecret++;
break;
case 'C':
myArr[1]++;
if (myArr[1] == checkArr[1]) checkSecret++;
break;
case 'G':
myArr[2]++;
if (myArr[2] == checkArr[2]) checkSecret++;
break;
case 'T':
myArr[3]++;
if (myArr[3] == checkArr[3]) checkSecret++;
break;
}
}
private static void remove(char ch) {
switch (ch) {
case 'A':
if (myArr[0] == checkArr[0]) checkSecret--;
myArr[0]--;
break;
case 'C':
if (myArr[1] == checkArr[1]) checkSecret--;
myArr[1]--;
break;
case 'G':
if (myArr[2] == checkArr[2]) checkSecret--;
myArr[2]--;
break;
case 'T':
if (myArr[3] == checkArr[3]) checkSecret--;
myArr[3]--;
break;
}
}
}