코테/백준

[백준/JAVA] 12891번: DNA 비밀번호

imname1am 2023. 4. 10. 13:00
반응형

🔺 문제

 

12891번: DNA 비밀번호

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

www.acmicpc.net

 

🔺 코드

import java.util.*;
import java.io.*;

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());   // DNA 문자열 길이
        int P = Integer.parseInt(st.nextToken());   // 비밀번호로 사용할 문자열 길이

        int Result = 0;

        char A[] = br.readLine().toCharArray();	// 민호가 임의로 만든 DNA 문자열

        checkArr = new int[4];  // 비밀번호 체크 배열
        myArr = 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++;
        }

        // 초기 P 부분 문자열 처리 부분
        for(int i = 0 ; i < P ; i++) {
        	Add(A[i]);
        }

        // 슬라이딩 윈도우 처리 부분
        for(int i = P ; i < S ; i++) {
            int j = i - P;

            Remove(A[j]);	// 가장 왼쪽 문자 삭제
            Add(A[i]);		// 가장 오른쪽 문자 추가

            if(checkSecret == 4) {
            	Result++;
            }
        }

        System.out.println(Result);
        br.close();
    }

    // 새로 들어온 문자 처리
    private static void Add(char c) {
        switch(c) {
            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 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;
        }
    }	
}
✅ 해결 아이디어
- 슬라이딩 윈도우...

🔺 다른 풀이들

- 풀이1)

 

[백준] 12891번: DNA 비밀번호 - java

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Main { static int s_len; static int p_len; static char[] str; static int[] checkArr = new i

jyeonnyang2.tistory.com

설명이 굿이셔서.. 복습할 때 보기 좋을 것 같은,,!

 

 

- 풀이2)

 

(Java/자바) - 백준(BOJ) 12891번 : DNA 비밀번호

https://www.acmicpc.net/problem/12891 12891번: DNA 비밀번호 평소에 문자열을 가지고 노는 것을 좋아하는 민호는 DNA 문자열을 알게 되었다. DNA 문자열은 모든 문자열에 등장하는 문자가 {‘A’, ‘C’, ‘G’

recordofwonseok.tistory.com

HashMap<Character, int[]> 을 사용하셨다.


💬 느낀 점

오메 어렵다,,,,,

읽고 이해하는 데만 1시간 반 걸림,,,ㅋㅋㅋㅠ

 

1회독 2회독 3회독 4회독 5회독
V 6/10      
반응형