DNA 염기 서열 분석
템플릿에 주어진 염기 서열에서 TAGG, CCAG, AGCC가 총 몇 번 등장하는지 세어보자.
String dna = "GATCCGCCCGCCTCGGCCTCCCAAAGTGCTGGGATTACAGGTGTGAGCCA"
+ "CCACGCCCGGCTAATTTTTATTTATTTATTTAAAGACAGAGTCTCACTCT"
+ "GTCACTCAGGCTAGAGTGCAGTGGCACCATCTCAGCTCACTGCAGCCTTG"
+ "ACCTCCCTGGGCTCCGGTGATTTCACCCTCCCAAGTAGCTAGGACTACAG"
+ "GCACATGCCACGACACCCAGCTAATTTTTTATTTTCTGTGAAGTCAAGGT"
+ "CTTGCTACGTTGCCCATGCTGGTATCAAACCCCTGGGCTCAATCAATCCT"
+ "TCCACCTCAGCCTCCCCAAGTATTGGGGTTACAGGCATGAGCTACCACAC"
+ "TCAGCCCTAGCCTACTTGAAACGTGTTCAGAGCATTTAAGTTACCCTACA"
+ "GTTGGGCAAAGTCATCTAACACAAAGCCCTTTTTATAGTAATAAAATGTT"
+ "GTATATCTCATGTGATTTATTGAATATTGTTACTGAAAGTGAGAAACAGC"
+ "ATGGTTGCATGAAAGGAGGCACAGTCGAGCCAGGCACAGCCTGGGCGCAG"
+ "AGCGAGACTCAAAAAAAGAAAAGGCCAGGCGCACTGGCTCACGCCTGTAA"
+ "TCCCAGCATTTCGGGAGGCTGAGGCGGGTGGATCACCTGAGGTCAGGAGT"
+ "TCAAGACCAGCCTAGCCAACATGGTGAAACCCCGTCTCTACTAAAATACA"
+ "AAAATTAACCGGGCGTGATGGCAGGTGCCTGTAATCCCAGCTACTTGGGA"
+ "GGCTGAGGCAGGAGAATCGCTTGAACCAGGAGGCGGAGGTTGCAGGGAGC"
+ "CAAGATGGCGCCACTGCACTCCAGCCTGGGCGATAGAGTGAGACTCCGTC"
+ "TCAGAAAAAAAAGAAAAGAAACGAGGCACAGTCGCATGCACATGTAGTCC"
+ "CAGTTACTTGAGAGGCTAAGGCAGGAGGATCTCTTGAGCCCAAGAGTTTG"
+ "AGTCCAGCCTGAACAACATAGCAAGACATCATCTCTAAAATTTAAAAAAG"
+ "GGCCGGGCACAGTGGCTCACACCTGTAATCCCAGCACTTTGGGAGGTGGA"
+ "GGTGGGTAGATCACCTGACGTCAGGAGTTGGAAACCAGCCTGGCTAACAT";
char[] charArray = dna.toCharArray();
일단 TAGG, CCAG, AGCC가 각각 몇 개씩 있는지 담을 변수가 필요하니 아래와 같이 생성.
// TAGG, CCAG, AGCC
int tagg = 0, ccag = 0, agcc = 0;
반복문
그리고 이제 charArray를 탐색할 for문을 아래와 같이 만들어 주자.
for (int i = 0; i < charArray.length - 3; i++) {
}
눈 여겨 볼 점은 두 가지!!!!!
int i = 0에서 시작한 것과, i < charArray.length - 3까지만 탐색한다는 점.
문자열의 첫 줄("GATCCGCCCGCCTCGGCCTCCCAAAGTGCTGGGATTACAGGTGTGAGCCA")을 보자.
우린 이 문자열을 "GATC"(인덱스 0~3), "ATCC"(인덱스 1~4), "TCCG"(2~5), "CCGC"(3~6), ... 이런 식으로 확인한다.
그러다가 맨 마지막 줄("GGTGGGTAGATCACCTGACGTCAGGAGTTGGAAACCAGCCTGGCTAACAT")에서 "ACAT"까지만 확인해야한다. "ACAT"은 인덱스 length - 4부터 length - 1까지이기 때문에 종결식을 i < charArray.length - 3으로 잡으면 된다.
길이 4인 염기서열 형성
for문의 수행 부분에 들어갈 때마다 검사할 문자 4개를 담을 4칸짜리 문자 배열(char[])을 선언.
for (int i = 0; i < charArray.length - 3; i++) {
char[] current = new char[4];
}
for문 안에서 배열을 선언하는 이유는 반복문을 벗어나면 더 이상 쓸 일이 없기 때문이다.
하지만, 다른 관점에서 생각해 볼 수도 있다. 배열을 새로 만드는 작업의 비용이 클 수 있기 때문에, 여러 번 반복하며 만들지 않고 for문 밖에서 한 번만 만들고 재사용하는 것이 나을 수도 있다.
char[] current = new char[4];
for (int i = 0; i < charArray.length - 3; i++) {
}
최종적으로는 for문 밖에서 배열을 만드는 것으로~
그 다음은 반복문 내에 또 반복문을 만들어 검사해야 할 문자열 4개를 순서대로 채워 넣자.
char[] current = new char[4];
for (int i = 0; i < charArray.length - 3; i++) {
for (int j = 0; j < current.length; j++) {
current[j] = charArray[i + j];
}
}
current 배열의 0번 부터 3번까지를, charArray 배열의 i + 0 번부터 i + 3 번 까지 채워 넣으면 된다.
예를 들어 i = 2일 때,
current[0] = charArray[2]; // T
current[1] = charArray[3]; // C
current[2] = charArray[4]; // C
current[3] = charArray[5]; // G
이렇게 되는 것이다. 이제 채워넣은 current 배열을 가지고 우리가 찾는 염기서열을 세어보자.
char[] current = new char[4];
for (int i = 0; i < charArray.length - 3; i++) {
for (int j = 0; j < current.length ; j++) {
current[j] = charArray[i + j];
}
// char[]을 String으로 변환
// 예: ['a', 'b', 'c', 'd'] => "abcd"
String seq = new String(current);
}
이렇게 문자열로 변환시키는 이유는 switch문의 변수로 문자열을 사용할 수 있기 때문이다.
문자 배열 자체로도 검사할 수 있지만 코드가 너무 길어진다..
염기서열 세기
이제 switch문을 이용해서 염기서열을 세면 된다.
switch (seq) {
case "TAGG":
tagg++;
break;
case "CCAG":
ccag++;
break;
case "AGCC":
agcc++;
break;
}
해당 케이스를 찾으면 각각 염기서열을 찾은 개수를 보관하는 변수에 1을 추가해주면 된다.
최종 코드
public class Main {
public static void main(String[] args) {
String dna = "GATCCGCCCGCCTCGGCCTCCCAAAGTGCTGGGATTACAGGTGTGAGCCA"
+ "CCACGCCCGGCTAATTTTTATTTATTTATTTAAAGACAGAGTCTCACTCT"
+ "GTCACTCAGGCTAGAGTGCAGTGGCACCATCTCAGCTCACTGCAGCCTTG"
+ "ACCTCCCTGGGCTCCGGTGATTTCACCCTCCCAAGTAGCTAGGACTACAG"
+ "GCACATGCCACGACACCCAGCTAATTTTTTATTTTCTGTGAAGTCAAGGT"
+ "CTTGCTACGTTGCCCATGCTGGTATCAAACCCCTGGGCTCAATCAATCCT"
+ "TCCACCTCAGCCTCCCCAAGTATTGGGGTTACAGGCATGAGCTACCACAC"
+ "TCAGCCCTAGCCTACTTGAAACGTGTTCAGAGCATTTAAGTTACCCTACA"
+ "GTTGGGCAAAGTCATCTAACACAAAGCCCTTTTTATAGTAATAAAATGTT"
+ "GTATATCTCATGTGATTTATTGAATATTGTTACTGAAAGTGAGAAACAGC"
+ "ATGGTTGCATGAAAGGAGGCACAGTCGAGCCAGGCACAGCCTGGGCGCAG"
+ "AGCGAGACTCAAAAAAAGAAAAGGCCAGGCGCACTGGCTCACGCCTGTAA"
+ "TCCCAGCATTTCGGGAGGCTGAGGCGGGTGGATCACCTGAGGTCAGGAGT"
+ "TCAAGACCAGCCTAGCCAACATGGTGAAACCCCGTCTCTACTAAAATACA"
+ "AAAATTAACCGGGCGTGATGGCAGGTGCCTGTAATCCCAGCTACTTGGGA"
+ "GGCTGAGGCAGGAGAATCGCTTGAACCAGGAGGCGGAGGTTGCAGGGAGC"
+ "CAAGATGGCGCCACTGCACTCCAGCCTGGGCGATAGAGTGAGACTCCGTC"
+ "TCAGAAAAAAAAGAAAAGAAACGAGGCACAGTCGCATGCACATGTAGTCC"
+ "CAGTTACTTGAGAGGCTAAGGCAGGAGGATCTCTTGAGCCCAAGAGTTTG"
+ "AGTCCAGCCTGAACAACATAGCAAGACATCATCTCTAAAATTTAAAAAAG"
+ "GGCCGGGCACAGTGGCTCACACCTGTAATCCCAGCACTTTGGGAGGTGGA"
+ "GGTGGGTAGATCACCTGACGTCAGGAGTTGGAAACCAGCCTGGCTAACAT";
char[] charArray = dna.toCharArray();
// TAGG, CCAG, AGCC
int tagg = 0, ccag = 0, agcc = 0;
char[] current = new char[4];
for (int i = 0; i < charArray.length - 3; i++) {
for (int j = 0; j < current.length ; j++) {
current[j] = charArray[i + j];
}
// char[]을 String으로 변환
// 예: ['a', 'b', 'c', 'd'] => "abcd"
String seq = new String(current);
switch (seq) {
case "TAGG":
tagg++;
break;
case "CCAG":
ccag++;
break;
case "AGCC":
agcc++;
break;
}
}
// 테스트
System.out.println("TAGG: " + tagg);
System.out.println("CCAG: " + ccag);
System.out.println("AGCC: " + agcc);
}
}
TAGG: 1
CCAG: 12
AGCC: 15
'TIL > Java' 카테고리의 다른 글
[Java] 객체 지향 프로그래밍이란? (0) | 2021.12.29 |
---|---|
[Java] 다중 배열(Multi Array) (0) | 2021.12.28 |
[Java] 배열(Array) (0) | 2021.12.28 |
[Java] 조건문과 반복문_For (0) | 2021.12.27 |
[Java] 조건문과 반복문_While (0) | 2021.12.27 |