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

'Playground > 자바문제집' 카테고리의 다른 글

[백준] 1874번  (0) 2023.04.06
[백준] 2750번  (0) 2023.04.06
[백준] 1940번  (0) 2023.04.05
[백준] 2018번  (0) 2023.04.04
[프로그래머스] 숫자의 표현  (0) 2023.03.30