본문 바로가기

컴퓨터/백준

JAVA - 백준 알고리즘 - 1969 DNA

반응형

이 문제는 알고리즘 스터디를 하는 도중 강사님께서 그리디 알고리즘 연습문제로 추천해주신 것이다.

 

차례대로 문자열을 입력받아 각각의 자리에 들어가는 A C G T의 개수를 세어주고

 

Math.max() 함수를 이용하여 갯수를 비교해주었고 가장 큰 값을 차례대로 입력했다.

 

입력할 때 사전 순으로 정렬하기 위해서 A C G T의 순서로 for문을 작성하였다.

 

max가 아닌 알파벳의 모든 갯수를 더해주어 Hamming Distance를 얻었다.

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	static int N, M, result;
	static String result1;
	static String[][] arr;
	static int[][] count;

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();

		StringTokenizer st = new StringTokenizer(str, " ");

		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		result = 0;
		result1= "";
		arr = new String[N][M];
		count = new int[M][4];
		// A=0 C=1 G=2 T=3

		for (int i = 0; N > i; ++i) {
			str = br.readLine();
			for (int j = 0; M > j; ++j) {
				arr[i][j] = str.substring(j, j + 1);
			}
		} // 입력

		for (int i = 0; N > i; ++i) {
			for (int j = 0; M > j; ++j) {
				switch (arr[i][j]) {
				case "A":
					count[j][0]++;
					break;
				case "C":
					count[j][1]++;
					break;
				case "G":
					count[j][2]++;
					break;
				case "T":
					count[j][3]++;
					break;
				}
			}
		}  // A C G T 갯수 세기

		for (int j = 0; M > j; ++j) {
			if (Math.max(Math.max(count[j][0], count[j][1]), Math.max(count[j][2], count[j][3])) == count[j][0]) {
				result1 += "A";
				result = result + count[j][1] + count[j][2] + count[j][3];
			} else if (Math.max(Math.max(count[j][0], count[j][1]),
					Math.max(count[j][2], count[j][3])) == count[j][1]) {
				result1 += "C";
				result = result + count[j][0] + count[j][2] + count[j][3];
			} else if (Math.max(Math.max(count[j][0], count[j][1]),
					Math.max(count[j][2], count[j][3])) == count[j][2]) {
				result1 += "G";
				result = result + count[j][1] + count[j][0] + count[j][3];
			} else if (Math.max(Math.max(count[j][0], count[j][1]),
					Math.max(count[j][2], count[j][3])) == count[j][3]) {
				result1 += "T";
				result = result + count[j][1] + count[j][2] + count[j][0];
			}
		}
        // 사전순으로 출력하기 위해 A C G T 순으로 입력함.

		System.out.println(result1);
		System.out.print(result);
		// 출력
	}

}
반응형