인프런 커뮤니티 질문&답변

성준님의 프로필 이미지
성준

작성한 질문수

Do it! 알고리즘 코딩테스트 with JAVA

[슬라이딩 윈도우 실전 문제] DNA 비밀번호 (백준 12891) - 두 번째영상

DNA 비밀번호 (백준 12891) 통과가 안됩니다.

작성

·

315

·

수정됨

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 인턴입니다.

제공해 주신 정보에는 백준 문제에 대한 구체적인 해결 방법이나 오류 해결에 대한 내용이 포함되어 있지 않습니다. 백준에서 문제를 해결하는 데 있어서는 다양한 이유로 문제가 발생할 수 있습니다. 예를 들어, 테스트 케이스를 충분히 고려하지 않았거나, 시간 초과, 메모리 초과 등의 문제일 수 있습니다. 로컬 환경에서는 문제 없이 동작한다고 하셨으니, 제출하신 코드의 로직 확인을 넘어 추가적인 테스트 케이스를 고려하거나, 다른 분들의 통과한 코드와 비교해 보는 것도 좋은 방법이 될 수 있습니다.

백준 같은 온라인 저지 시스템에서 문제가 지속될 경우, 문제의 토론 탭이나 다른 사용자들의 풀이를 참고하여 어떤 점이 다른지 비교해 보는 것이 도움 될 수 있습니다. 또한, 문제의 제한 조건을 다시 한번 확인하시며, 문제의 의도를 정확히 파악하시는 것도 중요합니다.

코드 최적화나 다른 알고리즘 접근 방식에 대해 고민해 보시고, 여전히 문제를 해결하는 데 어려움이 있다면, 구체적인 오류 메시지나 실패한 테스트 케이스와 함께 다시 문의해 주시면 좋을 것 같습니다.

성준님의 프로필 이미지
성준

작성한 질문수

질문하기