[Java] 12891 DNA 비밀번호

ideal dev·2023년 3월 7일
0

코딩테스트

목록 보기
64/69

1. 문제 링크 및 문제

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

2. 해결 방법 생각해보자 ...

0~P까지의 문자 비교
1~P+1 문자 비교
2~P+2 문자 비교
를 해야하므로 위와 같은 슬라이딩 윈도우 과정을 거친다.

문자를 비교하는 방법은 A,G,C,T 만 사용하므로
각각을 알파벳 순서에 맞춰 (0부터 시작)
A : 0
B
C : 2
D E F
G : 6
H I J K L M N O P Q R S
T : 19
로도 구분할 수 있다.

따라서 int[20] 배열을 생성한 후,
각각 들어오는 문자열에 맞춰 0~P 까지의 문자를 확인하며 int[현재문자] ++ ; 을 해준다.
ex) AACA = int[0] = 3 ,int[2] = 1

위 과정이 P번 이루어지면 비밀번호로 사용할 수 있는 지 확인해야 한다.
그건 int[] 배열에 담긴 현재 문자열의 정보와, 문제에서 주어진 최소A,C,G,T 사용 개수와 비교하여 true OR false 를 반환한다!

3. 코드

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

public class Main{

	static int S, P ;
	static char[] DNAstr;
	static int[] DNAnums = new int[20] ; // 0 ="A", 1="C", 6="G", 19="T"
	static int minA, minC, minG , minT ;
	public static int stoi(String str){
		return Integer.parseInt(str);
	}

    public static void main(String args[]) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		S = stoi(st.nextToken()); //DNA문자열 길이
		P = stoi(st.nextToken()); //부분문자열 길이
		DNAstr = br.readLine().toCharArray(); // 문자열 입력

		// 사용가능한 A,C,G,T 개수 입력받기
		st = new StringTokenizer(br.readLine());
		minA = stoi(st.nextToken());
		minC = stoi(st.nextToken());
		minG = stoi(st.nextToken());
		minT = stoi(st.nextToken());


		System.out.println(Sliding());
    }

	public static int Sliding(){
		int count = 0 ;
		int start = 0 ; // 시작지점
		int end = P; //끝지점

		for(int i=0;i<P;i++){ //P 길이만큼
			int nowStr = DNAstr[i]-'A'; // 현재 문자
			DNAnums[nowStr] ++ ;
		}

		if(CheckStr()) count ++ ;

		for(int i=P;i<S;i++){
			int befStr = DNAstr[i-P]-'A'; // 이전 문자
			DNAnums[befStr] -- ;

			int nowStr = DNAstr[i]-'A'; // 현재 문자
			DNAnums[nowStr] ++ ;

			if(CheckStr()) count ++ ;
		}

		return count ;
	}

	public static boolean CheckStr(){
		// DNAnums A C G T
		if(DNAnums[0] >= minA && DNAnums[2] >= minC && DNAnums[6]>=minG && DNAnums[19]>=minT) return true ;
		else return false ;
	}
}

0개의 댓글