공부/알고리즘

[python] Codility Lesson 5-2. GenomicRangeQuery

richpark 2021. 7. 26. 18:49

 

1. 처음 보고 prefix-sum이 아닌 나만의 풀이로 도전했다가 performance점수에서 0을 받아 62점을 받았다.

def solution(S, P, Q):
    # write your code in Python 3.6
    # A C G T 1 2 3 4
    answer_list = list()
    for j in range(len(P)):
        min_val = min(set(S[P[j]:Q[j]+1]))
        answer_list.append(min_val)
    return change_To_int(answer_list)

def change_To_int(answer_list: list)->list:
    answer = list()
    for i in range(len(answer_list)):
        if answer_list[i] == "A":
            answer.append(1)
        elif answer_list[i] == "C":
            answer.append(2)
        elif answer_list[i] == "G":
            answer.append(3)
        elif answer_list[i] == "T":
            answer.append(4)    
    return answer

 

 

2. 역시 pre-fix-sum의 개념을 사용하여야 performance 점수를 받을 수 있었다.

 

(출처 : https://davi06000.tistory.com/57)

 

pre-fix-sum 활용의 간단한 예와, 문제 적용을 잘 나타내 주셨다.

def solution(S, P, Q):
    # write your code in Python 3.6
    # you can write to stdout for debugging purposes, e.g.
    # print("this is a debug message")
    A, C, G, T = 0, 0, 0, 0

    cummulated = [[0, 0, 0, 0]]
    for char in S:
        if char == "A":
            A += 1
        elif char == "C":
            C += 1
        elif char == "G":
            G += 1
        elif char == "T":
            T += 1
        cummulated.append([A, C, G, T])

    i_f_table = {"A": 1, "C": 2, "G": 3, "T": 4}
    answer = []
    for p, q in zip(P, Q):
        left, right = cummulated[p], cummulated[q + 1]
        if left[0] != right[0]:
            answer.append(1)
        elif left[1] != right[1]:
            answer.append(2)
        elif left[2] != right[2]:
            answer.append(3)
        elif left[3] != right[3]:
            answer.append(4)
        else:
            answer.append(i_f_table[S[p]])
    return answer

 

728x90