Computer Science/알고리즘(백준+프로그래머스)

[문제해결기법 1주차] DNA

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

 

1969번: DNA

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

www.acmicpc.net

https://jaimemin.tistory.com/762

 

백준 1969번 DNA

문제 링크입니다: https://www.acmicpc.net/problem/1969 그리디(Greedy) 알고리즘으로 분류되어있지만 오히려 브루트 포스(Brute Force) 알고리즘에 가까운 문제였습니다. 처음에 문제에서 요구하는 바를 이해하..

jaimemin.tistory.com

-> 모든 경우의 수를 다 탐색하는 브루트포스라고 할수 있다.

 

#include <iostream>
#include<string>
#include<vector>
#include<string.h>

using namespace std;


int main() {
	int t = 0;
	int m = 0;
    int n=0;
	int gene[4]; // 저장할 각 염기 서열
	vector<string>v;
	string dna = "";
	int dist = 0;
	//m이 넣는 서열 개수, n이 염기 서열들의 길이


	cin >> t;

	while (t--) {
		v.clear();
		memset(gene, 0, sizeof(gene));
		dist = 0;
		dna = "";

		cin >> m >> n;
		for (int i = 0; i < m; i++) {
			string str;
			cin >> str;
			v.push_back(str);
		}//초기화 안했더니 계속틀림 유의

		for (int i = 0; i < n; i++) {
			memset(gene, 0, sizeof(gene));//서열 각각위치에서 계속 초기화시켜줘야함
			for (int j = 0; j < m; j++) {
				char c = v[j][i];//j개의 염기들을 비교하며 각각 i위치에 있는 염기가 무엇인지 파악해야함

				if (c == 'A') {
					gene[0]++;
				}
				else if (c == 'C') {
					gene[1]++;
				}
				else if (c == 'G') {
					gene[2]++;
				}
				else if (c == 'T') {
					gene[3]++;
				}
			}

			int max = gene[0];
			int idx = 0;

			for (int i = 1; i < 4; i++) {
				if (gene[i] > max) {//크거나 같음 처리 안해서 a의 개수==c의 개수 여도 a가 최댓값
					idx = i;
					max = gene[i];
				}
			}
			// 개수가 같다면 알파벳순으로 처리!! a,c,g,t순으로 처리됨
			if (idx == 0) {
				dna = dna + 'A';
				for (int j = 0; j < m; j++) {
					//해밍거리 추가
					char c = v[j][i];// ex) v[0] string에서 대표서열과 첫번째 자리가 다르면 해밍거리 추가
					if (c != 'A') {
						dist++;
					}
				}
			}
		     if (idx == 1) {
				dna = dna + 'C';
				for (int j = 0; j < m; j++) {
					//해밍거리 추가
					char c = v[j][i];
					if (c != 'C') {
						dist++;
					}
				}
			}
			 if (idx == 2) {
				dna = dna + 'G';
				for (int j = 0; j < m; j++) {
					//해밍거리 추가
					char c = v[j][i];
					if (c != 'G') {
						dist++;
					}
				}
			}
			if (idx == 3) {
				dna = dna + 'T';
				for (int j = 0; j < m; j++) {
					//해밍거리 추가
					char c = v[j][i];
					if (c != 'T') {
						dist++;
					}
				}
			}
			
		}
		cout << dna << '\n' << dist << '\n';
	}
	
}

-> 백준문제랑 개똑같다 ㅂㄷㅂㄷ..백준 열심히 풀자ㅠㅠㅠㅠㅠ!!!