[백준 12891] 좋은 수 구하기(슬라이딩 윈도우)
- 💾 알고리즘/LeetCode_백준
- 2023. 5. 18. 14:10
2개의 포인터로 범위를 지정한 다음 범위를 유지한 채로 이동하며 문제를 해결하는 것이다.
투 포인터 알고리즘과 매유 유사하다.
📝 문제
https://www.acmicpc.net/problem/12891
💻 코드
package org.kyhslam.DoItAlgorithm.ch02;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;
public class p12891 {
private static int[] myCheckArr = new int[4];
private static int[] checkArr = new int[4];
private static int secret = 0;
public static void main(String[] args) throws IOException {
//문자입력받아서 ch배열에 넣을때
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
Scanner sc = new Scanner(System.in);
int S = sc.nextInt(); // 9
int P = sc.nextInt(); // 8
int answer = 0;
char[] ch = new char[S];
ch = bf.readLine().toCharArray();
// CCTGGATTG 2 0 1 1
// GATA 1 0 0 1
//int[] checkArr = new int[4];
//checkArr = new int[]{2, 0, 1, 1};
for (int i = 0; i < 4; i++) {
checkArr[i] = sc.nextInt();
if (checkArr[i] == 0) {
secret++;
}
}
System.out.println("Arrays.toString(ch) = " + Arrays.toString(ch));
System.out.println("Arrays.toString(checkArr) = " + Arrays.toString(checkArr));
//처음에 초기화
for (int i = 0; i < P; i++) {
ADD(ch[i]);
}
if (secret == 4) {
answer++;
}
System.out.println("Arrays.toString(myCheckArr) = " + Arrays.toString(myCheckArr));
for (int i = P; i < S; i++) {
int j = i - P;
ADD(ch[i]); // 추가
REMOVE(ch[j]); //앞쪽 제거
if (secret == 4) {
answer++;
}
}
System.out.println("answer = " + answer);
bf.close();
}
private static void REMOVE(char c) {
switch (c) {
case 'A':
if(myCheckArr[0] == checkArr[0]) {
secret--;
}
myCheckArr[0]--;
break;
case 'C':
if (myCheckArr[1] == checkArr[1]) {
secret--;
}
myCheckArr[1]--;
break;
case 'G':
if (myCheckArr[2] == checkArr[2]) {
secret--;
}
myCheckArr[2]--;
break;
case 'T':
if (myCheckArr[3] == checkArr[3]) {
secret--;
}
myCheckArr[3]--;
break;
}
}
private static void ADD(char c) {
switch (c) {
case 'A':
myCheckArr[0]++;
if(myCheckArr[0] == checkArr[0]) {
secret++;
}
break;
case 'C':
myCheckArr[1]++;
if (myCheckArr[1] == checkArr[1]) {
secret++;
}
break;
case 'G':
myCheckArr[2]++;
if (myCheckArr[2] == checkArr[2]) {
secret++;
}
break;
case 'T':
myCheckArr[3]++;
if (myCheckArr[3] == checkArr[3]) {
secret++;
}
break;
}
}
}
'💾 알고리즘 > LeetCode_백준' 카테고리의 다른 글
[백준 17298] 오큰수 (스택) (0) | 2023.05.30 |
---|---|
[백준 11003] 최솟값 찾기 (슬라이딩 윈도우) (0) | 2023.05.25 |
[백준 1253] 좋은 수 구하기(투 포인터) (0) | 2023.05.18 |
[백준 1940] 주몽의 명령(투 포인터) (0) | 2023.05.18 |
[백준 2018] 수들의 합 5(투 포인터) (0) | 2023.05.17 |