12891_DNA비밀번호
633
작성한 질문수 5
package baekjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class p12891_DNA비밀번호 {
static int[] myArr;
static int[] checkArr;
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());
int p = Integer.parseInt(st.nextToken());
int result = 0;
checkArr = new int[4]; // 비밀번호 체크 배열
myArr = new int[4]; // 현재 상태 배열
char[] a = new char[s];
checkSecret = 0; // 현재 p개 중 몇개가 비밀번호 요건에 만족하는지
a = br.readLine().toCharArray();
st = new StringTokenizer(br.readLine());
for (int i = 0; i < 4; i++) {
checkArr[i] = Integer.parseInt(st.nextToken());
if (checkArr[i] == 0) {
checkSecret++; // i번째 값은 이미 완성됨.
}
}
for (int i = 0; i < p; i++) { // 부분 문자열 처음 받을 때 세팅
Add(a[i]); // 현재 상태 배열에 담음
}
if (checkSecret == 4) {
result++;
}
// 슬라이딩 윈도우
for (int i = p; i < s; i++) {
int j = i - p; // j = 맨 왼쪽, i = 맨 오른쪽
Add(a[i]); // 오른쪽에 있는 값 추가
Remove(a[j]);
if (checkSecret == 4) {
result++;
}
}
System.out.println(result);
br.close();
}
private static void Remove(char c) {
switch (c) {
case 'A':
if (myArr[0] == checkArr[0]) // 같으면 이번에 빠짐으로써 충족이 안 되는 것이니까 checkSecret 하나 줄임
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;
}
}
private static void Add(char c) {
switch (c) {
case 'A':
myArr[0]++;
if (myArr[0] == checkArr[0])
checkSecret++; // 'A'가 더 많이 들어온다고 해서 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;
}
}
}
현재 백준에서 문제가 통과되지 않고 있는데 혹시 잘못된 부분이라도 있을까요?ㅠ
답변 3
0
혹시 문제 해결하셨나요? ㅠㅠ 저도 동일한 문제를 겪고 있어서요
0
"package baekjoon;" 삭제하고
클래스명을 "public class p12891_DNA비밀번호" -> "public class Main" 으로 변경하니까 해결되었습니다!
0
안녕하세요 해당강의 같이보고있는 사람입니다.
백준 온라인저지에 문제를 제출할때 첫번째라인의 "package baekjoon;" 을 제거하시고 메인클래스 이름을 Main으로 바꾸신다음에 다시 제출해보시길바랍니다.
delet -> "package baekjoon;"
change -> "public class p12891_DNA비밀번호" to "public class Main"
0
안녕하세요, 인프런 AI 인턴이에요.
해당 코드는 백준 온라인 저지에서 12891번 문제인 “DNA비밀번호”를 풀기 위한 코드로 보입니다.
코드를 간략히 설명해드리면, 주어진 문자열에서 길이가 p인 부분 문자열 중에서 ‘A’, ‘C’, ‘G’, ’T’가 각각 checkArr[0], checkArr[1], checkArr[2], checkArr[3] 개 이상 포함된 경우를 찾는 문제입니다.
이 코드는 슬라이딩 윈도우 알고리즘을 사용하여 문제를 해결하고 있습니다. 주어진 문자열에서 길이가 p인 부분 문자열을 하나씩 확인하며, 해당 문자열이 비밀번호 요건에 맞는지 확인합니다.
상세한 내용은 코드가 끊겨있어서 확인할 수 없지만, Add 함수와 Remove 함수는 현재 상태 배열에 문자열을 추가하거나 제거하는 기능을 하는 것으로 추측됩니다.
결과적으로, 비밀번호 요건에 맞는 부분 문자열의 개수를 result 변수에 저장하고, 최종적으로 출력하는 부분입니다.
코드에 대한 이해를 돕기 위해서는 아쉽게도 누락된 부분이 많아 정확한 설명은 어렵습니다. 필요한 부분이 있다면 추가로 질문해주시면 더 자세한 답변을 드릴 수 있을 것 같아요.
백준 1940 주몽의 명령 시간복잡도
0
59
0
다음영상이 문제 풀이 영상이라고 하셨는데 문제풀이 영상이 누락되어있는 것 같습니다
0
127
1
코딩테스트 디버깅
0
344
1
탐색 순서 질문
0
148
1
[P11726 2*N 타일채우기] top down 방식을 사용하니 런타임 에러가 발생합니다.
0
105
1
2018 연속된 자연수의 합 구하기 백준 사이트에서 메모리 초과 오류가 발생합니다.
0
201
1
1강 시간복잡도 중간에 중첩for문 직전에 상수는 상관없어요 하신 부분이 이해가 안됩니다
0
159
1
왜 int, long은 안되는지 궁금합니다.
0
224
1
DNA 비밀번호 (백준 12891) 통과가 안됩니다.
0
525
2
LCA 빠르게 구하기 Java 코드 시간초과
0
244
1
스택문제 백준 1874
1
458
1
백준11659 구간합 런타임 에러
0
306
1
백준 2178 미로탐색 질문 입니다.
0
448
1
구간합구하기1 (백준11659)
0
421
1
혹시 다른 ide에서 잘 돌아가는 프로그램이
0
349
1
내림차순으로 정렬하기 강의에서..
0
267
1
백준 11720 숫자의 합 질문 있습니다
0
433
1
(숫자의 합)1<=N <=100 사이의 값
0
383
1
소수구하기-백준 1929 질문
0
350
1
숫자의 합 구하기
0
388
1
안녕하세요 질문있습니다.
0
335
0
union 코드에 질문 있습니다.
0
399
2
[그리디 실전 문제] 최솟값을 만드는 괄호 배치 찾기 (백준 1541) - 반례를 못찾겠습니다 ㅠㅠ
1
308
1
[이진 탐색 실전 문제] 원하는 정수 찾기 편 질문
0
503
1





