• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

12891_DNA비밀번호

23.09.29 18:43 작성 조회수 395

0

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

이현진님의 프로필

이현진

2024.02.21

혹시 문제 해결하셨나요? ㅠㅠ 저도 동일한 문제를 겪고 있어서요

문수님의 프로필

문수

질문자

2024.02.21

"package baekjoon;" 삭제하고

클래스명을 "public class p12891_DNA비밀번호" -> "public class Main" 으로 변경하니까 해결되었습니다!

이현진님의 프로필

이현진

2024.02.21

아 저는 public class Main 으로 제출해도 정답으로 인식이 안되더라구요.. 정답으로 뜨셨으면 제 코드 다른 부분에 문제가 있겠네요.. 답변 감사합니다!

0

안녕하세요 해당강의 같이보고있는 사람입니다.

백준 온라인저지에 문제를 제출할때 첫번째라인의 "package baekjoon;" 을 제거하시고 메인클래스 이름을 Main으로 바꾸신다음에 다시 제출해보시길바랍니다.

delet -> "package baekjoon;"

change -> "public class p12891_DNA비밀번호" to "public class Main"

 

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.09.30

안녕하세요, 인프런 AI 인턴이에요.

해당 코드는 백준 온라인 저지에서 12891번 문제인 “DNA비밀번호”를 풀기 위한 코드로 보입니다.

코드를 간략히 설명해드리면, 주어진 문자열에서 길이가 p인 부분 문자열 중에서 ‘A’, ‘C’, ‘G’, ’T’가 각각 checkArr[0], checkArr[1], checkArr[2], checkArr[3] 개 이상 포함된 경우를 찾는 문제입니다.

이 코드는 슬라이딩 윈도우 알고리즘을 사용하여 문제를 해결하고 있습니다. 주어진 문자열에서 길이가 p인 부분 문자열을 하나씩 확인하며, 해당 문자열이 비밀번호 요건에 맞는지 확인합니다.

상세한 내용은 코드가 끊겨있어서 확인할 수 없지만, Add 함수와 Remove 함수는 현재 상태 배열에 문자열을 추가하거나 제거하는 기능을 하는 것으로 추측됩니다.

결과적으로, 비밀번호 요건에 맞는 부분 문자열의 개수를 result 변수에 저장하고, 최종적으로 출력하는 부분입니다.

코드에 대한 이해를 돕기 위해서는 아쉽게도 누락된 부분이 많아 정확한 설명은 어렵습니다. 필요한 부분이 있다면 추가로 질문해주시면 더 자세한 답변을 드릴 수 있을 것 같아요.