
내가 생각했을때 문제에서 원하는부분
첫째 줄에 염기 서열의 길이 N(1 ≤ N ≤ 1,000,000)이 주어진다.
둘째 줄에는 염기서열을 나타내는 길이가 N인 문자열이 주어진다.
첫째 줄에 최종 염기를 출력한다.
내가 이 문제를 보고 생각해본 부분
염기서열 : DNA의 기본단위 뉴클레오타이드의 구성성분 중 하나인 핵염기들을 순서대로 나열해 놓은 것을 말한다.
행과 열 모두 agct 순서이기에 이름 배열(agct[])에 순서대로 저장해서 각 문자가 담당하는 인덱스 번호를 배열을
통해구할 수 있게끔 했다.
그리고 해독표를 arr[]에 저장했다.
배열 agct[]에 순서와 따라 문자를 숫자로 변환해주는 함수이다.
agct의 문자 중 c와 같다면 그 인덱스 번호를 return한다.
num은 두개의 염기를 하나의 염기로 변환한 결과를 숫자로 변환한 것을 저장하는 변수이다.
idx1은 An-1(문자열의 맨 뒤에서 두번째)의 문자를 숫자로 변환한 결과를 저장하는 변수이다.
idx2는 An(문자열의 맨 뒤)의 문자를 숫자로 변환한 결과이며, 이 값은 num에서 넘겨 받는다.
그 이유는 맨 뒤의 2개의 염기를 변환한 결과(num)는 문자열의 가장 뒤에 2개의 염기 대신 붙어있게 되어 An이 되기 때문이다.
코드로 구현
package baekjoon.baekjoon_23;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 1672번 문제
public class Main794 {
static char agct[] = {'A', 'G', 'C', 'T'};
static char arr[][] = { // 염기서열 해독표
{'A', 'C', 'A', 'G'},
{'C', 'G', 'T', 'A'},
{'A', 'T', 'C', 'G'},
{'G', 'A', 'G', 'T'}
};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 염기 서열의 길이
String s = br.readLine(); // 염기서열을 나타내는 길이가 N인 문자열
int num = charToInt(s.charAt(N - 1));
for(int i = N - 1; i > 0; i--) {
int idx1 = charToInt(s.charAt(i - 1));
int idx2 = num;
// 제일 끝에 있는 두 개의 염기를 하나의 염기로 바꾸기
char c = arr[idx1][idx2];
num = charToInt(c);
}
System.out.println(agct[num]);
br.close();
}
// 문자를 agct의 순서에 맞춰 숫자로 바꿔준다.
public static int charToInt(char c) {
int num = 0;
for(int i = 0; i < 4; i++) {
if(c == agct[i]) {
num = i;
break;
}
}
return num;
}
}
전역으로 염기서열관련해서 정의해주고 재귀함수를 사용해서 로직을 구현했다.