inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Do it! Thuật toán Kiểm tra Lập trình với JAVA

[Bài toán thực hành cửa sổ trượt] Mật khẩu DNA (Baekjoon 12891) - Video thứ hai

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

525

b200079291

1 câu hỏi đã được viết

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;
        }
    }
}

로컬에선 문제없이 동작하는데 백준에서는 계속 통과가 안되네요.. 혹시 동일하신분들 계실까요?

java 코딩-테스트 알고리즘

Câu trả lời 2

0

jiyong012

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

case 'A':

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

checkSecret--;

}

myArr[0]--;

break;

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

0

communityai8509

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

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

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

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

백준 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

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

12891_DNA비밀번호

0

633

3

숫자의 합 구하기

0

389

1

안녕하세요 질문있습니다.

0

336

0

union 코드에 질문 있습니다.

0

399

2

[그리디 실전 문제] 최솟값을 만드는 괄호 배치 찾기 (백준 1541) - 반례를 못찾겠습니다 ㅠㅠ

1

308

1

[이진 탐색 실전 문제] 원하는 정수 찾기 편 질문

0

503

1