minhui study

백준 1969번 DNA(Python, C++) 본문

백준 문제풀이/그리디 알고리즘

백준 1969번 DNA(Python, C++)

minhui 2020. 8. 18. 13:47

https://www.acmicpc.net/problem/1969

 

1969번: DNA

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

www.acmicpc.net

첫 줄에 DNA의 수 N과 문자열의 길이 M이 주어진다. 그리고 둘째 줄부터 N+1번째 줄까지 N개의 DNA가 주어진다.

(N은 1,000보다 작거나 같은 자연수이고, M은 50보다 작거나 같은 자연수이다.)

 

Hamming Distance합이 가작 작아야하므로 각 DNA의 특정 위치 문자들만 추출하여 A, C, G, T와 비교한 후 A, C, G, T 중에서 가장 많은 것을 골라 출력할 DNA의 그 특정 위치에 넣어준다. 즉, 예를 들어 첫번째 문자들 중 A가 가장 많으면 결과로 출력될 DNA의 첫 번째 문자가 A가 되는 것이다.

그리고 Hamming Distance합도 구해야 하므로 n에서 가장 많이 나온 문자 갯수를 빼준 값을 m번 더한다. 즉, 첫번 째 글자에서의 차이 + 두 번째 글자에서의 차이 + ... + ... 인 셈이다.

 

 

<Python>

n, m = map(int, input().split()) 
count = 0
result = ''
d = []
for i in range(n):
    d.append(input())

for i in range(m):
    A = [0,0,0,0] # a,c,g,t
    for j in range(n):
        if d[j][i] == 'A':
            A[0]+=1
        elif d[j][i] == 'C':
            A[1]+=1
        elif d[j][i] == 'G':
            A[2]+=1
        elif d[j][i] == 'T':
            A[3]+=1
    idx = A.index(max(A))
    if idx == 0:
        result += 'A'
    elif idx==1:
        result += 'C'
    elif idx==2:
        result += 'G'
    elif idx==3:
        result += 'T'  
    count += n - max(A)

print(result)
print(count)

 

 

<C++>

#include <stdlib.h>
#include <iostream>
#include <string>
#include<algorithm>
using namespace std;

int n, m;

int main(void) {

	string result = "";
	int count = 0;
	cin >> n >> m;

	int cnt[50][4]; // a,c,g,t

	for (int i=0; i < n; i++) {
		string dna;
		cin >> dna;
		for (int j=0; j < m; j++) {
			switch (dna[j]) 
			{
			case 'A' :
				cnt[j][0]++;
				break;
			case 'C' :
				cnt[j][1]++;
				break;
			case 'G' :
				cnt[j][2]++;
				break;
			case 'T':
				cnt[j][3]++;
				break;
		
			}
		}
	}

	for (int i = 0; i < m; i++) {
		int max = 0;
		int idx = 0;
		for (int j = 0; j < 4; j++) {
			if (cnt[i][j] > max) {
				max = cnt[i][j];
				idx = j;
			}
		}
		count += n - max;
		switch (idx)
		{
		case 0:
			result += 'A';
			break;
		case 1:
			result += 'C';
			break;
		case 2:
			result += 'G';
			break;
		case 3:
			result += 'T';
			break;

		}

	}
	cout << result << "\n";
	cout << count << "\n";
	return 0;
}
Comments