[백준/BOJ] 백준 12891번 : DNA 비밀번호
2023. 10. 19. 01:48ㆍ알고리즘 문제풀이
https://www.acmicpc.net/problem/12891
슬라이딩 윈도우를 통해 조건을 만족하는 비밀번호의 개수를 구했다.
코드
#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;
}
'알고리즘 문제풀이' 카테고리의 다른 글
[백준/BOJ] 백준 25577번 : 열 정렬정렬 정 (0) | 2023.10.19 |
---|---|
[백준/BOJ] 백준 12003번 : Diamond Collector (Silver) (1) | 2023.10.19 |
[백준/BOJ] 백준 27652번 : AB (0) | 2023.10.19 |
[백준/BOJ] 백준 17353번 : 하늘에서 떨어지는 1, 2, ..., R-L+1개의 별 (0) | 2023.10.19 |
[백준/BOJ] 백준 18780번 : Timeline (0) | 2023.10.19 |