Hard deck/reindexing d2

009 : sliding window

서버관리자 페페 2023. 6. 19. 13:25

 

 

 

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;
        }
    }
}