Coding Test/codility
[Codility] GenomicRangeQuery c++
owls
2022. 8. 11. 15:00
728x90
- 문제
DNA서열은 A, C, G, T 로 구성 되어 있고 1, 2, 3, 4 로 표현된다.
string으로 DNA 서열이 주어진다.
배열 P ,Q 의 K번째 값으로
string s의 K(P) ~ K(Q)번째 원소들 중 서열이 제일 먼저인 DNA 인덱스를 저장한다.
- 문제 해결
2중 for문을 사용하면 시간 복잡도 테스트를 통과하지 못해서
2중 for문을 사용하지 않게 코드를 짜보았다.
// you can use includes, for example:
#include <algorithm>
vector<int> solution(string &S, vector<int> &P, vector<int> &Q) {
vector<int> result;
for (int i = 0; i < P.size(); i++) {
int index = Q[i] - P[i];
string tmp("");
if (index != 0) tmp = S.substr(P[i], index+1);
else
tmp.push_back(S[P[i]]);
sort(tmp.begin(), tmp.end());
int nucle = 0;
if ('A' == tmp[0]) nucle = 1;
else if ('C' == tmp[0]) nucle = 2;
else if ('G' == tmp[0]) nucle = 3;
else {
nucle = 4;
}
result.push_back(nucle);
}
return result;
}
후.. 시간 복잡도를 더 줄여야한다.
#include <algorithm>
bool myCompare(pair<int, int> a, pair<int, int> b){
if(a.first == b.first){
return a.second < b.second;
}
else{
return a.first < b.first;
}
}
vector<int> solution(string &S, vector<int> &P, vector<int> &Q) {
vector<int> result;
vector<pair<int, int>> v;
for(int i = 0; i < S.size(); i++){
int nCh = 0;
if('A' == S[i]){
nCh = 1;
}
else if('C' == S[i]){
nCh = 2;
}
else if('G' == S[i]){
nCh = 3;
}
else{
nCh = 4;
}
v.push_back(make_pair(nCh, i));
}
sort(v.begin(), v.end(), myCompare);
for(int i = 0; i < P.size(); i++){
for(int j = 0; j < v.size(); j++){
if(P[i] <= v[j].second && v[j].second <= Q[i]){
result.push_back(v[j].first);
break;
}
}
}
return result;
}
728x90