A DNA sequence can be represented as a string consisting of the letters A, C, G and T, which correspond to the types of successive nucleotides in the sequence. Each nucleotide has an impact factor, which is an integer. Nucleotides of types A, C, G and T have impact factors of 1, 2, 3 and 4, respectively. You are going to answer several queries of the form: What is the minimal impact factor of nucleotides contained in a particular part of the given DNA sequence?
The DNA sequence is given as a non-empty string S = S[0]S[1]...S[N-1] consisting of N characters. There are M queries, which are given in non-empty arrays P and Q, each consisting of M integers. The K-th query (0 ≤ K < M) requires you to find the minimal impact factor of nucleotides contained in the DNA sequence between positions P[K] and Q[K] .(inclusive).
For example, consider string S = CAGCCTA and arrays P, Q such that:
P[0] = 2 Q[0] = 4
P[1] = 5 Q[1] = 5
P[2] = 0 Q[2] = 6
The answers to these M = 3 queries are as follows:
Write a function:
class Solution { public int[] solution(String S, int[] P, int[] Q); }
that, given a non-empty string S consisting of N characters and two non-empty arrays P and Q consisting of M integers, returns an array consisting of M integers specifying the consecutive answers to all queries.
Result array should be returned as an array of integers.
For example, given the string S = CAGCCTA and arrays P, Q such that:
P[0] = 2 Q[0] = 4
P[1] = 5 Q[1] = 5
P[2] = 0 Q[2] = 6
the function should return the values [2, 4, 1], as explained above.
Write an efficient algorithm for the following assumptions:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> ans;
vector<int> solution(string &S, vector<int> &P, vector<int> &Q) {
vector<int> cnt(4);
vector<vector<int> > accm;
fill(cnt.begin(), cnt.end(), 0);
accm.push_back( {0, 0, 0, 0 }); // P[i] = 0인 경우를 고려해 초기 값 넣어줌.
// A, C, G, T 의 누적 카운트를 저장
for(int i=0;i<S.size();i++) {
if(S[i] == 'A') cnt[0]++;
else if(S[i] == 'C') cnt[1]++;
else if(S[i] == 'G') cnt[2]++;
else cnt[3]++;
accm.push_back(cnt);
}
for(int i=0;i<P.size();i++) {
for(int j=0;j<4;j++) {
// [0,0,0,0]을 고려해 Q[i]+1 - P[i]
int num = accm[Q[i]+1][j] - accm[P[i]][j];
if(num > 0) {
ans.push_back(j+1);
break;
}
}
}
return ans;
}
이중 for문을 통해 풀었더니 성능오류가 발생했다..
결국 구글의 도움을 받았다.. 어려운 문제였다 😥