작성
·
310
·
수정됨
0
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] myArr; // 내가 받은 문자열의 부분 문자열 조건 만족하는지 확인용
static int[] checkArr; // 주어진 부분 문자열 조건
static int checkSecret; // 모두 만족하는지 카운트
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
int S = Integer.parseInt(stringTokenizer.nextToken()); // 문자열의 길이
int P = Integer.parseInt(stringTokenizer.nextToken()); // 부분 문자열의 길이
int result = 0;
myArr = new int[4];
checkArr = new int[4];
checkSecret = 0;
char[] A; // 주어진 문자열을 담을 배열
A = bufferedReader.readLine().toCharArray();
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
for(int i = 0; i < 4; i++) {
checkArr[i] = Integer.parseInt(stringTokenizer.nextToken());
if(checkArr[i] == 0) { // 주어진 조건이 0이면 이미 만족하기 때문에 checkSecret을 1증가시켜줌
checkSecret++;
}
}
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;
Add(A[i]);
Remove(A[j]);
if(checkSecret == 4) {
result++;
}
}
System.out.println(result);
bufferedReader.close();
}
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;
}
}
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;
}
}
}
로컬에선 문제없이 동작하는데 백준에서는 계속 통과가 안되네요.. 혹시 동일하신분들 계실까요?
답변 2
0
안녕하세요. 혹시 해결하셨을까요?
case 'A':
if (myArr[0] == checkArr[0]) {
checkSecret--;
}
myArr[0]--;
break;
이런식으로 Remove()에서 myArr[]--;를 if문 바깥쪽으로 꺼내서 작성해보시면 될 것 같습니다
0
안녕하세요, 인프런 AI 인턴입니다.
제공해 주신 정보에는 백준 문제에 대한 구체적인 해결 방법이나 오류 해결에 대한 내용이 포함되어 있지 않습니다. 백준에서 문제를 해결하는 데 있어서는 다양한 이유로 문제가 발생할 수 있습니다. 예를 들어, 테스트 케이스를 충분히 고려하지 않았거나, 시간 초과, 메모리 초과 등의 문제일 수 있습니다. 로컬 환경에서는 문제 없이 동작한다고 하셨으니, 제출하신 코드의 로직 확인을 넘어 추가적인 테스트 케이스를 고려하거나, 다른 분들의 통과한 코드와 비교해 보는 것도 좋은 방법이 될 수 있습니다.
백준 같은 온라인 저지 시스템에서 문제가 지속될 경우, 문제의 토론 탭이나 다른 사용자들의 풀이를 참고하여 어떤 점이 다른지 비교해 보는 것이 도움 될 수 있습니다. 또한, 문제의 제한 조건을 다시 한번 확인하시며, 문제의 의도를 정확히 파악하시는 것도 중요합니다.
코드 최적화나 다른 알고리즘 접근 방식에 대해 고민해 보시고, 여전히 문제를 해결하는 데 어려움이 있다면, 구체적인 오류 메시지나 실패한 테스트 케이스와 함께 다시 문의해 주시면 좋을 것 같습니다.