minhui study
백준 1969번 DNA(Python, C++) 본문
https://www.acmicpc.net/problem/1969
첫 줄에 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;
}
'백준 문제풀이 > 그리디 알고리즘' 카테고리의 다른 글
백준 1138번 한 줄 서기(Python, C++) (0) | 2020.08.19 |
---|---|
백준 2529번 부등호(Python, C++) (0) | 2020.08.18 |
백준 1120번 문자열(python) (0) | 2020.07.03 |
백준 2875번 대회 or 인턴 (python) (0) | 2020.07.03 |
백준 1541번 잃어버린 괄호 (python) (0) | 2020.06.01 |
Comments