백준 - DNA 비밀번호
문제 링크
https://www.acmicpc.net/problem/12891
문제 입출력
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 |