[JAVA] 백준 12891: DNA 비밀번호

바위너구리·2023년 1월 5일
0

백준 풀이🐬

목록 보기
15/17
post-thumbnail

문제

실버 2
https://www.acmicpc.net/problem/12891

풀이

package Baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class S2_12891 {

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());

    //s, p, ans
    int s = Integer.parseInt(st.nextToken());
    int p = Integer.parseInt(st.nextToken());
    int ans = 0;

    //dna
    st = new StringTokenizer(br.readLine());
    char[] dna = st.nextToken().toCharArray();

    //acgt 카운트
    int[] acgt = new int[4];
    st = new StringTokenizer(br.readLine());
    for (int i = 0; i < 4; i++) {
      acgt[i] = Integer.parseInt(st.nextToken());
    }

    //첫번째 부분 문자열
    int start = 0;
    int end = p - 1;
    char[] first_arr = Arrays.copyOfRange(dna, start, end+1);

//    System.out.println(first_arr);

    //부분문자열의 acgt 개수 배열
    int[] cnt = new int[4];

    for (char f : first_arr) {
      count(f, cnt, 1);
    }

    if (cnt[0] >= acgt[0] && cnt[1] >= acgt[1] && cnt[2] >= acgt[2] && cnt[3] >= acgt[3]) {
      ans++;
    }

//    System.out.println(Arrays.toString(cnt));

    while (end + 1 < s) {
      count(dna[start], cnt, -1);
      start++;
      end++;
      //처음과 끝 카운트
      count(dna[end], cnt, 1);
//      System.out.println(dna[start] + " " + dna[end]);
//      System.out.println(Arrays.toString(cnt));

      if (cnt[0] >= acgt[0] && cnt[1] >= acgt[1] && cnt[2] >= acgt[2] && cnt[3] >= acgt[3]) {
        ans++;

      }
    }

    System.out.println(ans);

  }

  static void count(char c, int[] cnt_arr, int add) {
    if (c == 'A') {
      cnt_arr[0] += add;
    } else if (c == 'C') {
      cnt_arr[1] += add;
    } else if (c == 'G') {
      cnt_arr[2] += add;
    } else if (c == 'T') {
      cnt_arr[3] += add;
    }
  }
}

다른 풀이

package Baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;

public class dfhjkd {

  static int[] cnt= new int['Z'+1];


  public static void main(String[] args) throws IOException {
    BufferedReader input= new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer tokens = new StringTokenizer(input.readLine());

    int S=Integer.parseInt(tokens.nextToken());
    int P=Integer.parseInt(tokens.nextToken());

    String Dna = input.readLine();

    int[] min_num=new int[4];

    int totalCnt = 0;

    tokens= new StringTokenizer(input.readLine());
    for(int i=0;i<4;i++) {
      min_num[i]=Integer.parseInt(tokens.nextToken());
    }

    for(int i=0;i<P;i++) {
      cnt[Dna.charAt(i)]++;
    }

    if(isAble(min_num)) {
      totalCnt++;
    }

    for(int i=0;i<S-P;i++) {
      cnt[Dna.charAt(i)]--;
      cnt[Dna.charAt(i+P)]++;

      if(isAble(min_num)) totalCnt++;

    }

    System.out.println(totalCnt);

  }

  static boolean isAble(int[] min_num) {
    return cnt['A']>=min_num[0] && cnt['C']>=min_num[1] && cnt['G']>=min_num[2] && cnt['T']>=min_num[3];
  }


}

이런 방법이.,..

0개의 댓글