STUDY/코딩테스트 연습(PS)

백준/1969번(Greedy)/C++

hyunah 2021. 3. 4. 23:07

문제 설명

 

주의할 점

: DNA s1,s2....sn 중 Hamming Distance의 합이 가장 작은 DNA si를 찾는 것이 아니라, 가장 작은 DNA s를 구하는 것이다. 처음에 문제를 잘못 이해해서 잘못 풀었다.

 

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int n, m;
string s[1001];
char result[1001];
int ncount[4];

int main(void) {
	cin >> n >> m;

	for (int i = 0; i < n; i++) {
		cin >> s[i];
	}

	int hammingD = 0;

	for (int i = 0; i < m; i++) {
		fill(ncount, ncount + 4, 0);
		for (int j = 0; j < n; j++) {
			switch (s[j][i])
			{
			case 'A':
				ncount[0]++;
				break;
			case 'C':
				ncount[1]++;
				break;
			case 'G':
				ncount[2]++;
				break;
			case 'T':
				ncount[3]++;
				break;
			}
		}

		int maxv = 0;
		int maxIndex = 0;

		for (int k = 0; k < 4; k++) {
			if (ncount[k] > maxv) {
				maxv = ncount[k];
				maxIndex = k;
			}
		}

		if (maxIndex == 0) result[i] = 'A';
		else if (maxIndex == 1) result[i] = 'C';
		else if (maxIndex == 2) result[i] = 'G';
		else result[i] = 'T';

		hammingD += (n - maxv);
	}

	for (int i = 0; i < m; i++) {
		cout << result[i];
	}
	cout << '\n' << hammingD;
}

 

디버깅 기록

: 배열의 value값과 index값을 혼동하지말자. 정말 기본 중의 기본, 기초인데 자주 실수한다. 반복문을 사용하는 경우에는 꼭!꼭!꼭! 초기화해줘야 하는 값이 있지는 않은지 두 번, 세 번 확인하자. 여기서도 ncount배열을 초기화 하지 않아서 초반에 오류가 났다.