[백준 12891] 좋은 수 구하기(슬라이딩 윈도우)

2개의 포인터로 범위를 지정한 다음 범위를 유지한 채로 이동하며 문제를 해결하는 것이다.

투 포인터 알고리즘과 매유 유사하다.


📝 문제

https://www.acmicpc.net/problem/12891

 

12891번: DNA 비밀번호

평소에 문자열을 가지고 노는 것을 좋아하는 민호는 DNA 문자열을 알게 되었다. DNA 문자열은 모든 문자열에 등장하는 문자가 {‘A’, ‘C’, ‘G’, ‘T’} 인 문자열을 말한다. 예를 들어 “ACKA”

www.acmicpc.net

💻 코드

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

댓글

Designed by JB FACTORY