-
[Codility] GenomicRangeQuery c++Coding Test/codility 2022. 8. 11. 15:00728x90
- 문제
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'Coding Test > codility' 카테고리의 다른 글
[codility] MinAbsSum c++ (2) 2022.09.23 [Codility] NumberSolitaire c++ (0) 2022.09.16 [codility] MaxCounters c++ (0) 2022.04.10 [codility] MaxCounters c++ (0) 2022.04.10 [codility] PermCheck c++ (0) 2022.04.09