[BJ12891] DNA 비밀번호
✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺/백준 알고리즘

[BJ12891] DNA 비밀번호

 

 백준 - DNA 비밀번호 

문제 링크

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

 

12891번: DNA 비밀번호

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

www.acmicpc.net

 

문제 입출력

4 2
GATA
1 0 0 1
2

 

문제 풀이

package day220805.practice;


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/*
 * [입력]
 * S(임의로 만든 DNA 문자열의 길이) P(비밀번호로 사용할 부분문자열의 길이)
 * dna(임의로 만든 dna 문자열)
 * 포함되어야할 A C G T 갯수
 * 
 * [주의]
 * - 슬라이딩 윈도우? 를 사용하라고 그랬지?
 * - 투 포인터?
 * */


public class BJ12891_DNA비밀번호2 {
	static int S, P, ans;
	static char dna[];
	static int minA, minC, minG, minT; // 최소로 들어있어야하는 값
	static int cntA, cntC, cntG, cntT; // 실제로 부분문자열에 카운팅되는 값


	// 각 dna 의 최소 문자의 수를 만족하는지 확인하는 함수
	private static void check() {
		if (minA <= cntA && minC <= cntC && minG <= cntG && minT <= cntT) ans++;
	}


	// 슬라이딩 윈도우 사용
	private static void solve() {
		// 초기값 갱신
		for (int i = 0; i < P; i++) {
			switch (dna[i]) {
			case 'A':
				cntA++;
				break;
			case 'C':
				cntC++;
				break;
			case 'G':
				cntG++;
				break;
			case 'T':
				cntT++;
				break;
			}

		}

		// 최소 문자수 확인 카운팅
		check();

		// 슬라이딩 윈도우 사용
		for (int i = P; i < S; i++) {
			// 초기값 뺴주기
			switch (dna[i - P]) {
			case 'A':
				cntA--;
				break;
			case 'C':
				cntC--;
				break;
			case 'G':
				cntG--;
				break;
			case 'T':
				cntT--;
				break;
			}

			// 새로 들어오는 값 더해주기
			switch (dna[i]) {
			case 'A':
				cntA++;
				break;
			case 'C':
				cntC++;
				break;
			case 'G':
				cntG++;
				break;
			case 'T':
				cntT++;
				break;
			}

			check();
		}

	} // end solve


	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("Input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		// 변수 입력
		StringTokenizer st = new StringTokenizer(br.readLine());
		S = Integer.parseInt(st.nextToken());
		P = Integer.parseInt(st.nextToken());

		// 배열 입력
		dna = new char[S];
		dna = br.readLine().toCharArray();

		// 만족해야하는 최소의 갯수
		st = new StringTokenizer(br.readLine());
		minA = Integer.parseInt(st.nextToken());
		minC = Integer.parseInt(st.nextToken());
		minG = Integer.parseInt(st.nextToken());
		minT = Integer.parseInt(st.nextToken());

		solve();
		System.out.println(ans);

	} // end main
}

 

 

 

 

 

 

 

 

 

 

# 백준 DNA 비밀번호 java # BJ12891 java


 

 

728x90

'✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺 > 백준 알고리즘' 카테고리의 다른 글

[BJ12493] 탑  (0) 2022.08.08
[BJ2023] 신기한 소수  (0) 2022.08.08
[BJ21921] 블로그  (0) 2022.08.08
[BJ1244] 스위치 켜고 끄기  (0) 2022.08.01
[BJ2309] 일곱 난쟁이  (0) 2022.08.01