https://www.acmicpc.net/problem/1969
import java.util.*;
import java.io.*;
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // DNA의 수
int M = Integer.parseInt(st.nextToken()); // 문자열의 길이
//2차원 배열에 입력을 초기화
char[][] arr = new char[N][M];
for (int i = 0; i < N; i++) {
char[] input = br.readLine().toCharArray();
for (int j = 0; j < M; j++) {
arr[i][j] = input[j];
}
}
//4개의 문자의 개수를 Map에 저장
StringBuilder sb = new StringBuilder();
Map<Character, Integer> map = new HashMap<>();
initializeMap(map);
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
char cur = arr[j][i];
map.put(cur, map.get(cur) + 1);
}
//등장횟수가 가장 많으면서 사전순으로 앞인 알파벳 구하기
char maxKey = 'Z';
int maxValue = 0;
for (char key : map.keySet()) {
int val = map.get(key);
if (val > maxValue) {
maxKey = key;
maxValue = val;
} else if (val == maxValue) {
if (key < maxKey) {
maxKey = key;
maxValue = val;
}
}
}
sb.append(maxKey);
initializeMap(map);
}
//Hamming Distance 합 구하기
char[] DNA = sb.toString().toCharArray();
int ret = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (DNA[j] != arr[i][j]) {
ret++;
}
}
}
sb.append(System.lineSeparator());
sb.append(ret);
System.out.println(sb);
}
private static void initializeMap(Map<Character, Integer> map) {
map.put('A', 0);
map.put('C', 0);
map.put('T', 0);
map.put('G', 0);
}
}
Hamming Distance
의 합을 가장 작게 만드는 dna와 그 합을 구하는 문제이다.Hamming Distance
란 두 DNA를 비교하여 각 자리마다 다른 알파벳의 개수를 의미한다.1) 각 자리별로 가장 많이 등장하는 알파벳을 각각 구한 후에
2) 1)에서 구해진 DNA와 입력 DNA들간의 Hamming Distance의 합을 구하면 된다.
N X M
크기의 배열에 모든 입력을 저장한 뒤, 세로 방향으로 각 알파벳의 개수를 구한다.Map
을 사용하였다.Hamming Distance의 합
을 구하면 된다.