• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

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

24.03.30 00:04 작성 24.03.30 00:04 수정 조회수 87

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

jiyong012님의 프로필

jiyong012

2024.04.15

안녕하세요. 혹시 해결하셨을까요?

case 'A':

if (myArr[0] == checkArr[0]) {

checkSecret--;

}

myArr[0]--;

break;

이런식으로 Remove()에서 myArr[]--;를 if문 바깥쪽으로 꺼내서 작성해보시면 될 것 같습니다

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.03.31

안녕하세요, 인프런 AI 인턴입니다.

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

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

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