#include <bits/stdc++.h>
using namespace std;
int origin[4], mmm[4], n = 0, sz = 0, answer = INT_MAX;
char sss[4] = { 'A', 'C', 'G', 'T' };
void SetCount(int val[], char c, bool sign)
{
for (int i = 0; i < 4; ++i)
{
if (sss[i] == c) { (sign) ? val[i]++ : val[i]--; break; }
}
}
bool Check(int val[])
{
for (int i = 0; i < 4; ++i)
{
if (mmm[i] == 0) continue;
if (val[i] < mmm[i]) return false;
}
return true;
}
int steadyGene(string gene)
{
n = gene.size();
sz = n / 4;
for (int j = 0; j < n; ++j)
{
for (int i = 0; i < 4; ++i)
{
if (gene[j] == sss[i])
{
origin[i]++;
break;
}
}
}
bool allPass = true;
for (int i = 0; i < 4; ++i)
{
mmm[i] = origin[i] - sz;
if (mmm[i] <= 0) { mmm[i] = 0; continue; }
allPass = false;
}
if (allPass) return 0;
int calc[4] = { 0, }, ffIdx = 0;
for (int j = 0; j < n; ++j)
{
SetCount(calc, gene[j], true);
if (Check(calc) == false) continue;
while (ffIdx <= j)
{
answer = min(answer, j - ffIdx + 1);
SetCount(calc, gene[ffIdx], false);
ffIdx++;
if (Check(calc) == false) break;
}
}
return answer;
}
* 문제 풀이 과정
문제에서 말하는 4 가지의 문자 A,C,G,T 가 문자열의 길이 n 에서 n / 4 Time 만큼 등장해야한다고 되어있다.
이 때, 바꿀 수 있는 부분 문자열의 최소 길이를 구하라는 문제이다.
핵심은 n / 4 번보다 추가되는 문자가 포함된 부분문자열을 찾으면 된다.
이 부분문자열은 A,C,G,T 가 n/4 번 나오게 무조건 만들 수 있는가 ??
단지 추가되는 문자만 부족한 문자로 바꿔주는 작업이기에 가능하다.
1. 문자열을 추가하면서 부족한 문자열이 포함되어있는지 확인한다.
2. 앞 문자를 지워가며 부족한 문자열이 포함되있는 조건을 만족하는지 확인하며
해당 부분문자열의 최솟값을 구한다.
예외적인 상황으로는,
A,C,G,T 가 n/4 번이 나오는 정상적인 문자열이 들어올 수 있기 때문에 확인해주어야한다.
'알고리즘 > HackerRank_문제풀이' 카테고리의 다른 글
[PS]#The Story of a Tree (0) | 2022.11.23 |
---|---|
[PS]#Lily's Homework (0) | 2022.11.20 |
[PS]#Ice Cream Parlor (0) | 2022.11.20 |
[PS]#Gridland Metro (0) | 2022.11.17 |
[PS]#Hackerland Radio Transmitters (0) | 2022.11.17 |