일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- ㅇ
- abstract
- HelloWorld
- throws
- Android
- Shared Elements
- opcode
- 회피
- 취약점
- 버킷리스트
- extends
- bytecode
- IMPLEMENT
- 여행계획
- 심리학
- Navigation Component
- Recylcer
- 보안
- 여행
- 일상탈출
- Transition
- 치유
- 일상회피
- static
- jvm
- javap
- 보안취약점
- 심리여행
- bytecode 분석
- Interface
- Today
- Total
패스트터틀
(Baekjoon) GreedyAlgorithm - (21) 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
대충 생각해보았을때 전부다 분석하는데 걸리는 시간은 어림잡아 O(n^2) 로 예상된다.
for(){
for(){
}
}
가장 차이가 적다는말은 가장 유사성이 높다는말과 같다.
그러므로 가장 많이 쓰인 뉴클레오티드를 사용하면 될것같다.
input : N(개수),M(길이)
output : 유사성높은 DNA, 나머지와의 차이
Adenine, Thymine, Guanine, Cytosine (A, T, G, C)의 개수를 파악할 배열
int DNA[M][4]; // ATGC 개수파악
char dna[N][M]; // dna 문자열 저장
DNA의 개수를 파악후 가장 많은것을 출력한다.
이때 비교할때 문자열 순서대로 와야하기 때문에 A,C,G,T 순서대로 비교를 한다.
---------------------------------------------------------------
문제를 잘못파악했다. 문자열 s는 기존에 주어진 DNA집합에 속한 원소가 아닌 새로운 원소 s라고 가정해야된다.
(문제를 잘못읽었다. 다음부턴 꼼꼼히 읽어야겠다.)
package GreedyAlgorithm;
import java.util.Scanner;
public class _1969 {
static int DNA[][];
static int N, M;
static char dna[][];
static String C;
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
DNA = new int[M][4];
dna = new char[N][M];
for (int j = 0; j < N; j++) {
C = sc.next();
for (int i = 0; i < M; i++){
dna[j][i] = C.charAt(i);
if (C.charAt(i)=='A')
DNA[i][0]++;
else if (C.charAt(i)=='C')
DNA[i][1]++;
else if (C.charAt(i)=='G')
DNA[i][2]++;
else
DNA[i][3]++;
}
}
char dap[] = new char[M];
for (int i = 0; i < M; i++) {
if (DNA[i][0] >= DNA[i][1] && DNA[i][0] >= DNA[i][2] && DNA[i][0] >= DNA[i][3])
dap[i] = 'A';
else if (DNA[i][1] >= DNA[i][0] && DNA[i][1] >= DNA[i][2] && DNA[i][1] >= DNA[i][3])
dap[i] = 'C';
else if (DNA[i][2] >= DNA[i][3] && DNA[i][2] >= DNA[i][1] && DNA[i][2] >= DNA[i][0])
dap[i] = 'G';
else
dap[i] = 'T';
}
for (int i = 0; i < M; i++) {
System.out.print(dap[i]);
}
int n=0;
for (int i = 0; i < N ; i++) {
for (int j = 0; j < M ; j++) {
if(dna[i][j] != dap[j]) n++;
}
}
System.out.println("\n"+n);
sc.close();
}
}
백준문제풀이Github :
https://github.com/sdk0213/baekjoon-study
sdk0213/baekjoon-study
solve a baekjoon question. Contribute to sdk0213/baekjoon-study development by creating an account on GitHub.
github.com
'Algorithm > baekjoon' 카테고리의 다른 글
(Baekjoon) GreedyAlgorithm - (23) 보석 도둑 (0) | 2020.01.28 |
---|---|
(Baekjoon) GreedyAlgorithm - (22) 문서 검색 (0) | 2020.01.16 |
(Baekjoon) GreedyAlgorithm - (20) 궁금한 민호 (0) | 2020.01.09 |
(Baekjoon) GreedyAlgorithm - (19) 멀티탭 스케줄링 (0) | 2019.12.30 |
(Baekjoon) GreedyAlgorithm - (18) 수리공 항승 (0) | 2019.12.20 |