본문 바로가기

CodingTEST

[백준 12891] DNA 비밀번호 (JAVA)

반응형

백준 12891번 문제  -  DNA 비밀번호

 

12891번: DNA 비밀번호

평소에 문자열을 가지고 노는 것을 좋아하는 민호는 DNA 문자열을 알게 되었다. DNA 문자열은 모든 문자열에 등장하는 문자가 {‘A’, ‘C’, ‘G’, ‘T’} 인 문자열을 말한다. 예를 들어 “ACKA”

www.acmicpc.net


 

문제 분석

 

 

  • 전체 DNA 문자열에서 P길이의 문자열로 비밀번호 제작
  • 비밀번호에는 필수 DNA 구성 요소가 존재, 이를 통해 비밀번호가 안전한지 확인
  • 안전한 비밀번호 개수를 출력

 


해결 키 포인트

 

슬라이딩 윈도우 - 두 개의 포인터로 범위를 유지하면서 이동


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

public class Main {
	public static void main(String [] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		// 문자열 길이 S와 부분문자열 길이 P 입력
		StringTokenizer st = new StringTokenizer(br.readLine());
		int S = Integer.parseInt(st.nextToken());
		int P = Integer.parseInt(st.nextToken());
		
		// DNA 문자열 입력
		st = new StringTokenizer(br.readLine());
		String DNA = st.nextToken();
		
		// 부분 문자열에 필요한 DNA에 구성 입력 
		st = new StringTokenizer(br.readLine());
		Long essential [] = new Long[4];
		for(int i=0;i<4;i++) {
			essential[i] = Long.parseLong(st.nextToken());
		}
		
		// 부분 문자열에 존재하는 DNA에 구성
		Long existence [] = new Long[4];
		for(int i=0;i<4;i++) {
			existence[i] = new Long(0);
		}
		
		// index 0 ~ P-1까지 DNA의 각 구성 개수 구하기
		for(int i=0;i<P;i++) {
			int index = getDNAConfigurationIndex(DNA.charAt(i));
			existence[index]++;
		}
		
		// 필요한 index (start, end) | 사용가능한 비밀 번호 개수 (count) 
		int start = 0, end = P-1, count = 0;
		
		// index end가 S(문자열 길이)가 될 때까지 반복 조사
		while(end<S) {
			// 필수 성분을 다 갖췄는지 확인 -> count++ 
			int check = 0;
			for(check=0;check<=4;check++) {
				if(check==4)
					break;
				if(essential[check]>existence[check])
					break;
			}
			if(check==4)
				count++;
			
			// start에 있는 성분을 existence 배열에서 제거
			int index = getDNAConfigurationIndex(DNA.charAt(start++));
			existence[index]--;
			
			// end가 마지막일 때 미리 대비해 break
			if(end+1 == S)
				break;
			
			// end에 있는 성분을 existence 배열에서 추가
			index = getDNAConfigurationIndex(DNA.charAt(++end));
			existence[index]++;
			
			
		}
		System.out.println(count);
	}
	
	// DNA 구성에 따른 index 정보를 알려주는 함수
	public static int getDNAConfigurationIndex(char c) {
		switch(c) {
		case 'A':
			return 0;
		case 'C':
			return 1;
		case 'G':
			return 2;
		case 'T':
			return 3;
		}
		return -1;
	}
}
 
 
반응형

'CodingTEST' 카테고리의 다른 글

[백준 17298번] 오큰 수 (JAVA)  (0) 2023.03.12
[백준 1874번] 스택 수열 (JAVA)  (1) 2023.03.08
[백준 11003번] 최솟값 찾기 (JAVA)  (0) 2023.03.06
[백준 1940] 주몽 (JAVA)  (0) 2023.03.04
[백준 1253] 좋다 (JAVA)  (0) 2023.03.04