12891. DNA 비밀번호
구간의 길이가 정해져 있다면, 일단 슬라이딩 윈도우를 생각해 볼 필요가 있다.
문자 개수 조건을 확인할 때 별도의 맵을 사용해서 조건보다 큰지 확인할 수도 있지만, 조건 맵에서 하나씩 빼고 더하면서 0보다 큰 수가 있는지 확인해줘도 된다.
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int SlidingWindow(string& DNA, int P, unordered_map<char, int>& umap)
{
auto check = [&umap]() { for (auto& pr : umap) if (0 < pr.second) return false; return true; };
int answer = 0;
for (int i = 0; i < P; ++i)
--umap[DNA[i]];
answer += check();
for (int i = P; i < DNA.length(); ++i)
{
++umap[DNA[i - P]];
--umap[DNA[i]];
answer += check();
}
return answer;
}
int main(int argc, char* argv[])
{
int P;
string DNA;
cin >> P >> P >> DNA;
unordered_map<char, int> umap;
cin >> umap['A'] >> umap['C'] >> umap['G'] >> umap['T'];
cout << SlidingWindow(DNA, P, umap);
return 0;
}
'자료구조 & 알고리즘 > 백준' 카테고리의 다른 글
2003. 수들의 합 2 (0) | 2023.09.17 |
---|---|
21921. 블로그 (0) | 2023.09.15 |
11441. 합 구하기 (0) | 2023.09.14 |
11657. 타임머신 (0) | 2023.09.13 |
1197. 최소 스패닝 트리 (0) | 2023.09.11 |