Codility - GenomicRangeQuery
링크
풀이방법
문제 그대로 갯수세서 풀면 O(N*M)으로 계산되기 때문에 TLE 에러에 걸린다. O(N*M) 을 O(N+M)으로 개선하기 위해서는, P[i] ~ Q[i] 계산시 매번 Minimun을 계산하는 방식이 아니라 새로운 배열에 누적치를 계산해놓고, 한번에 계산해야한다.
- https://app.codility.com/demo/results/trainingYRYNWY-ADK/
코드
def solution(S, P, Q): count_arr = [] dict = { "A": 0, "C": 1, "G": 2, "T": 3 } for i in range(len(S)): if not count_arr: temp = [0,0,0,0] cur_idx = dict[S[i]] temp[cur_idx] = 1 count_arr.append(temp) else: cur_idx = dict[S[i]] prev_item = count_arr[-1][:] prev_item[cur_idx] += 1 count_arr.append(prev_item) result = [] for idx in range(len(P)): p_idx = P[idx] q_idx = Q[idx] if p_idx == q_idx: result.append(dict[S[p_idx]]+1) else: if p_idx == 0: a = count_arr[q_idx] b = [0,0,0,0] else: a, b = count_arr[q_idx], count_arr[p_idx - 1] temp_arr = [ai-bi for ai, bi in zip(a,b) ] for idx,val in enumerate(temp_arr): if val != 0: result.append(idx +1) break return result
시간복잡도
O(N+M)
공간복잡도
O(N)