TP는 capacity도 필요없이 단순히 tocharArray()로 분배시켜주며 됨
myArr(focus locked)
-> checkArr(char > int checker)
-> checkSecret(int target)
각 알파벳에 임의의 숫자를 부과하면 int[] Array로 connect 시킬 수 있다
알파벳(char) - 알파벳pointer(int) - 알파벳수량value(int)
지금 lock된것을 개별 char로 보낸다
각 알파벳 갯수가 충족되면(0은 0) checkSecret에 1을 더하고, 해당 bottom이 4 높이로 올라가면 counter++;한다
SP로 넣고, 양 끝을 더하고 빼면서 작업
SP 작업시 모든 알파벳 필요갯수가 0인 경우에는 모든 선형 공간마다 pipeline으로 빠져나가 counter가 4번이나 올라갈 수 있다
> 선형 공간 작업이 모두 완료되고 난 뒤에 체크 작업
중간은 이미 계산되어 있으니 처음과 끝만 확인하면 된다
s = P - e(x)
s = e - P(o)
Add와 Remove를 한번만 거치면 해당 part는 계산이 완성되므로 for문 내에 체크 작업 할당
br 닫아줄 것
remove시에는 s와 e 사이 TP[i]를 모두 더하는 2 pointer 작업처럼 s에서 체크를 빼고 myArr[]을 제거한다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] myArr;
static int[] checkArr;
static int checkSecret;
public static void main(String[] args) throws IOException {
// ISC
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());
// D2F
char[] TP = br.readLine().toCharArray();
myArr = new int[4];
checkArr = new int[4];
checkSecret = 0;
st = new StringTokenizer(br.readLine());
for (int i = 0; i < 4; i++) {
checkArr[i] = Integer.parseInt(st.nextToken());
if (checkArr[i] == 0) {
checkSecret++;
}
}
// OP
int counter = 0;
for (int i = 0; i < P; i++) { // sp 처리
Add(TP[i]);
}
if (checkSecret == 4)
counter++;
for (int e = P; e < S; e++) {
int s = e - P;
Add(TP[e]);
Remove(TP[s]);
if (checkSecret == 4)
counter++;
}
// OEC
System.out.println(counter);
br.close();
}
static void Add(char c) {
switch (c) {
case 'A' -> {
myArr[0]++;
if (myArr[0] == checkArr[0])
checkSecret++;
}
case 'C' -> {
myArr[1]++;
if (myArr[1] == checkArr[1])
checkSecret++;
}
case 'G' -> {
myArr[2]++;
if (myArr[2] == checkArr[2])
checkSecret++;
}
case 'T' -> {
myArr[3]++;
if (myArr[3] == checkArr[3])
checkSecret++;
}
}
}
static void Remove(char c) {
switch (c) {
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;
}
}
}
'Hard deck > reindexing d2' 카테고리의 다른 글
002 : Array에 점수 저장하여 평균 구하기 (0) | 2023.06.20 |
---|---|
001 - string 입력을 개별합해서 출력하기 (0) | 2023.06.20 |
008 : 좋은 수 구하기 (0) | 2023.06.19 |
007 : 투 포인터 > 무작위 배열의 2가지 합 (0) | 2023.06.19 |
006 : 투 포인터 (0) | 2023.06.19 |