🔺 문제
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 |
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 10773번: 제로 (0) | 2023.04.10 |
---|---|
[백준/JAVA] 10828번: 스택 (0) | 2023.04.10 |
[백준/JAVA] 11478번: 서로 다른 부분 문자열의 개수 (0) | 2023.04.10 |
[백준/JAVA] 1269번: 대칭 차집합 (0) | 2023.04.10 |
[백준/JAVA] 1764번: 듣보잡 (0) | 2023.04.10 |