bear2132 2021. 1. 15. 00:04

www.acmicpc.net/problem/1969

 

1969번: DNA

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

www.acmicpc.net

더보기
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int N, M;
vector<char> DNA;

int main()
{
	cin >> N >> M;
	char dna;

	vector<char> result;
	char AGCT[4] = { 'A', 'C', 'G', 'T' };
	
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cin >> dna;
			DNA.push_back(dna);
		}
	}

	for (int i = 0; i < M; i++) {
		int a = 0;
		int g = 0;
		int c = 0;
		int t = 0;

		for (int j = 0; j < N; j++) {
			if (DNA[i + j * M] == 'A') {
				a++;
			}
			else if (DNA[i + j * M] == 'C') {
				c++;
			}
			else if (DNA[i + j * M] == 'G') {
				g++;
			}
			else if (DNA[i + j * M] == 'T') {
				t++;
			}
		}
		vector<int> count;
		
		count.push_back(a);
		count.push_back(c);
		count.push_back(g);
		count.push_back(t);

		int max = a;
		int max_num = 0;
		for (int x = 1; x < 4; x++) {
			if (max < count[x]) {
				max = count[x];
				max_num = x;
			}
		}
		result.push_back(AGCT[max_num]);
		count.clear();
		
	}

	for (int i = 0; i < size(result); i++) {
		cout << result[i];
	}


	
	int cc = 0;
	for (int i = 0; i < M; i++) {
		for (int j = 0; j < N; j++) {
			if (result[i] != DNA[i + j * M]) {
				cc++;
			}
		}
	}
	cout << endl;
	cout << cc;


}

 

 

더보기

1. Hamming Distance의 합이 가장 작은 DNA를 출력

예시)

N = 5  M = 8

1. TATGATAC

2. TAAGCTAC

3. AAAGATCC

4. TGAGATAC

5. TAAGATGT

 

각 DNA의 (1~5번 DNA) 1 ~ 8 (1 ~ M) 번째 [A, C, G, T] 개수를 세고 난 후 개수가 제일 큰 알파벳을 출력하게 한다.

결과 DNA : T A A G A T A C

 

만약 갯수가 같은 경우에 철자 순으로  뽑아내야 하기 때문에 A, C, G, T 순서로 저장을 해야 한다.

 

위에 나온 결과를 토대로 2중 for문을 돌려서 N번째 DNA와 결과 DNA가 같지 않을 경우를 세어줘서 출력한다.