[백준/BOJ] 백준 12891번 : DNA 비밀번호

2023. 10. 19. 01:48알고리즘 문제풀이

https://www.acmicpc.net/problem/12891

 

12891번: DNA 비밀번호

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

www.acmicpc.net

 

슬라이딩 윈도우를 통해 조건을 만족하는 비밀번호의 개수를 구했다.

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

int s, p;
string dna;
int check[4];
int result = 0;

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	cin >> s >> p;
	cin >> dna;

	for (int i = 0; i < 4; i++) {
		int input;
		cin >> input;

		check[i] = input;
	}

	vector<int> range_check(4, 0);
	for (int i = 0; i < p; i++) {
		if (dna[i] == 'A') {
			range_check[0]++;
		}
		else if (dna[i] == 'C') {
			range_check[1]++;
		}
		else if (dna[i] == 'G') {
			range_check[2]++;
		}
		else if (dna[i] == 'T') {
			range_check[3]++;
		}
	}

	//조건을 만족할때
	if (range_check[0] >= check[0] && range_check[1] >= check[1] && range_check[2] >= check[2] && range_check[3] >= check[3]) {
		result++;
	}

	int left = 0;
	int right = p - 1;
	while (1) {
		if (left + 1 >= s || right + 1 >= s) { //더이상 오른쪽으로 한칸 옮길 수 없을때
			break;
		}

		//left와 right 오른쪽으로 한칸 옮기기

		//left 오른쪽으로 옮기기
		if (dna[left] == 'A') {
			range_check[0]--;
		}
		else if (dna[left] == 'C') {
			range_check[1]--;
		}
		else if (dna[left] == 'G') {
			range_check[2]--;
		}
		else if (dna[left] == 'T') {
			range_check[3]--;
		}
		left++;

		//right 오른쪽으로 옮기기
		right++;
		if (dna[right] == 'A') {
			range_check[0]++;
		}
		else if (dna[right] == 'C') {
			range_check[1]++;
		}
		else if (dna[right] == 'G') {
			range_check[2]++;
		}
		else if (dna[right] == 'T') {
			range_check[3]++;
		}

		//조건을 만족할때
		if (range_check[0] >= check[0] && range_check[1] >= check[1] && range_check[2] >= check[2] && range_check[3] >= check[3]) {
			result++;
		}
	}

	cout << result;

	return 0;
}