알고리즘 공부(C++)

1969 DNA (파이썬 / 브루트포스)

혀니리리 2022. 9. 29. 15:40
728x90

1969번: DNA (acmicpc.net)

 

1969번: DNA

DNA란 어떤 유전물질을 구성하는 분자이다. 이 DNA는 서로 다른 4가지의 뉴클레오티드로 이루어져 있다(Adenine, Thymine, Guanine, Cytosine). 우리는 어떤 DNA의 물질을 표현할 때, 이 DNA를 이루는 뉴클레오

www.acmicpc.net

브루트포스문제..

N, M = map(int, input().split())
lst = []
result = []
res = 0
acgt = [0 for i in range(26)] #A,C,G,T
for i in range(N):
    lst.append(input())
for i in range(M):
    for j in range(N):
        acgt[ord(lst[j][i]) - ord('A')] += 1
    result.append(chr(acgt.index(max(acgt)) + ord('A')))
    acgt = [0 for i in range(26)]
for i in range(N):
    for j in range(M):
        if (result[j] != lst[i][j]):
            res += 1
print(('').join(map(str, result)))
print(res)

문제를 잘못 이해해서 다시 이해하기까지 시간이 좀 걸림

사실 더 깔끔히 풀고싶었는데 다른 풀이를 찾아봐도 거기서 거기더라..

그래서 그냥 내 코드에 대한 설명을 하고 알아둬야할 지식을 알아두고자 한다.

 

<코드 설명>

1.우선 같은값이 있으면 사전순으로 가장 먼저 오는 것을 출력하라고 했으므로 알파벳을 담을 수 있는 0으로 채워진 빈 리스트를 만듦

2.주어진 dna가닥들에서 각 줄에서 가장 많이 나온 알파벳들로 구성된 것이 우리가 구해야하는 답이므로 해당하는 알파벳이 나올 때마다 list에서 수를 증가시켜줌

3.채워진 list에서 가장 큰 값의 인덱스의 값을 구해서 거기에 'A'라는 char값을 더하면 알파벳이 되므로 그 상태로 result에 넣어줌

4.각 dna가닥들을 내가 만든 result 와 비교하면서 알파벳이 다를 때마다 더해서 최종적인 숫자까지 구해줌

 

<알아둬야 할 요소>

1.ord('A') => char 형태를 int로 바꾸기 위해 필요

2.chr(65) => int형태를 char로 바꾸기 위해 필요

3.lst.index(max(lst)) => 리스트에서 가장 값이 큰 항목의 인덱스값을 구해줌

728x90