ahlight
개발 저장소
ahlight
전체 방문자
오늘
어제
  • 분류 전체보기 (197)
    • Java (7)
    • Spring (5)
    • JPA (2)
    • JavaScript (0)
    • Computer Science (12)
      • 디자인패턴, 프로그래밍 패러다임 (1)
      • 네트워크 (4)
      • 운영체제 (4)
      • 데이터베이스 (3)
      • 자료구조 (0)
    • 알고리즘 (1)
    • 프로그래머스 (13)
    • 백준 (94)
    • 서평 (3)
    • 회고 (1)
    • TIL (58)
    • 기타 (1)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 넥스트스텝
  • 클린코드
  • TDD
  • 라즈베리파이4 #홈서버 #포트포워딩 #dhcp
  • Java

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ahlight

개발 저장소

백준

백준 1969번 ☆

2022. 11. 15. 19:40

문제

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

 

1969번: DNA

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

www.acmicpc.net

import java.util.Scanner;

public class Main1969 {
	
	static int N;
	static int M;
	static String[] dna;
	static boolean[] visit;
	static char[] dnas = {'A', 'T', 'G', 'C'};
	static char[] temp;
	static int min = Integer.MAX_VALUE;
	static String ans;
	
	public static void compare(int cnt) {
		int count=0;
		
		if (cnt == M) {
			for(int i=0; i<dna.length; i++) {
				for(int j=0; j<M; j++) {
					if (temp[j] != dna[i].charAt(j)) {
						count++;
					}
				}
			}
			
			if (count < min) {
				min = count;
				for (int i=0; i<M; i++) {
					ans += temp[i];
				}
			}

		} else {
			for(int i=0; i<M; i++) {
				if (!visit[i]) {
					if (i>3) {
						temp[cnt] = dnas[i];
						visit[i] = true;
						compare(cnt+1);
						visit[i] = false;
					} else {
						temp[cnt] = dnas[i];
						visit[i] = true;
						compare(cnt+1);
						visit[i] = false;
					}
					
				}
			}
		}
	}

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		N = sc.nextInt();
		M = sc.nextInt();
		
		dna = new String[N];
		visit = new boolean[dnas.length];
		temp = new char[M];
		
		for (int i=0; i<dna.length; i++) {
			dna[i] = sc.next();
		}
		
		sc.close();
		
		compare(0);
		
		System.out.println(ans);
		System.out.println(min);
	}
}
import java.util.Scanner;

public class Main1969_1 {

	static int N;
	static int M;
	static String[] dna;
	static char[] temp;
	static int sum;
	
	public static void compare() {
		
		for (int i=0; i<M; i++) {
			int[] count = new int[4];
			
			for (int j=0; j<N; j++) {
				
				switch(dna[j].charAt(i)) {
				case 'A' :
					count[0]++;
					break;
				case 'C' :
					count[1]++;
					break;
				case 'G' :
					count[2]++;
					break;
				case 'T' :
					count[3]++;
					break;
					
				}
			}
			
			int max = 0;
			int index = 0;
			
			for (int k=0; k<count.length; k++) {
				if (count[k] > max) {
					max = count[k];
					index = k;
				}
			}
			
			switch (index) {
			
			case 0 :
				temp[i] = 'A';
				break;
			case 1 :
				temp[i] = 'C';
				break;
			case 2 :
				temp[i] = 'G';
				break;
			case 3 :
				temp[i] = 'T';
				break;
			}
			
			sum += N - max;
		}
	}
	
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		N = sc.nextInt();
		M = sc.nextInt();
		
		dna = new String[N];
		temp = new char[M];
		
		for (int i=0; i<dna.length; i++) {
			dna[i] = sc.next();
		}
		
		compare();
		
		String string = new String(temp);
		
		System.out.println(string);
		System.out.println(sum);
	}
}

1. 첫번째 코드는 오답, 두번째 코드가 정답이다.

 

2. 문제이해부터 풀이까지 죄다 실수 투성이었다.

 

3. 첫번째 코드의 접근 방식은 각 자리에 A,C,G,T 4가지의 DNA를 배열에 넣으려했는데 경우의 수를 계산해보니 최대 4의 50제곱까지 나오기에 완전탐색으로 풀기에는 무리가 있다 판단했다. 사실 그 부분뿐만 아니라 다른 여러부분에서도 막혔지만..

 

4. 결국 못참고 구글링을 해서 문제를 해결했다. 다만 풀이도중 4가지의 DNA를 사전순으로 switch문내에서 작성하지 않아 계속 틀리면서 헤맸다. 문제를 좀 더 꼼꼼히 읽어야만 한다.

 

5. 이런 방식 말고도 여러 방식을 이용해서 해결할 수 있다. 다만 완전히 내 힘으로 푼 문제가 아니니 추후에 꼭 다시 풀어보자.

 

'백준' 카테고리의 다른 글

백준 2422번  (0) 2022.11.16
백준 2661번 ☆  (0) 2022.11.15
백준 22864번  (0) 2022.11.15
백준 19532번  (0) 2022.11.10
백준 2231번  (0) 2022.11.09
    '백준' 카테고리의 다른 글
    • 백준 2422번
    • 백준 2661번 ☆
    • 백준 22864번
    • 백준 19532번
    ahlight
    ahlight

    티스토리툴바