[백준] 1969번 DNA

거북이·2023년 1월 5일
0

백준[실버5]

목록 보기
53/114
post-thumbnail

💡문제접근

입력된 DNA 염기 서열을 각 자리마다 비교하여 Hamming Distance의 합이 가장 작은 DNA를 문자열로 추가해준다. 여기서 Hamming Distance의 합이 가장 작도록 하려면 사용 빈도가 잦은 DNA 염기를 문자열에 추가해주면 된다. 그리고 해당 DNA 염기 서열을 N개의 DNA 염기 서열과 비교하여 그 Hamming Distance의 합을 출력한다.

이 때, Hamming Distance의 합이 가장 작은 DNA가 여러 개인 경우 사전순으로 가장 앞서는 경우를 출력해야하는데 이 부분을 제대로 숙지하지 못해서 시간이 꽤 많이 걸렸다.

만약 두 개의 알파벳이 서로 동일한 경우 조건문에서 가장 최초로 참이 되는 지점의 실행문이 실행되므로 사전순으로 나오려면 A → C → G → T가 되어야 한다. 따라서 조건문을 작성할 때 이에 맞춰서 작성해줘야 사전순으로 가장 앞서는 것이 출력된다.

💡코드(메모리 : 30616KB, 시간 : 96ms)

N, M = map(int, input().split())
DNA = []
for _ in range(N):
    DNA.append(list(map(str, input())))

result = ""
for i in range(M):
    A = 0
    G = 0
    T = 0
    C = 0
    for j in range(N):
        if DNA[j][i] == "A":
            A += 1
        elif DNA[j][i] == "C":
            C += 1
        elif DNA[j][i] == "G":
            G += 1
        elif DNA[j][i] == "T":
            T += 1
    if max(A, G, T, C) == A:
        result += "A"
    elif max(A, G, T, C) == C:
        result += "C"
    elif max(A, G, T, C) == G:
        result += "G"
    elif max(A, G, T, C) == T:
        result += "T"

hamming_distance = 0
for i in range(N):
    for j in range(M):
        if DNA[i][j] != result[j]:
            hamming_distance += 1

print(result)
print(hamming_distance)

💡소요시간 : 2h

0개의 댓글