백준 문제풀이/그리디 알고리즘
백준 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;
}