백준 12891 DNA 비밀번호 문제를 풀고 다른 사람의 코드를 보며 이해가 안 되었던 코드가 있어 코드를 분석해보고 정리하는 글 입니다.
코드는 해당 문제를 풀어야지 보실 수 있습니다.
// 코드 일부
public class P12891_sa5369_62956445 {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int dnaStrLen, subStrLen;
static int[] dnaStr;
static int[] acgt;
public static void main(String[] args) throws Exception {
dnaStrLen = read();
subStrLen = read();
}
public static int read() throws Exception {
int c, n = System.in.read() & 15;
while ((c = System.in.read()) > 32)
n = (n << 3) + (n << 1) + (c & 15);
return n;
}
}
위 코드에서 read() 메서드 부분이었다.
입력 처리를 보통 BufferedReader & StringTokenizer를 통해 처리하는데 위 코드는 특이하게 System.in.read()
를 사용했다.
문자열을 구분자를 이용해 분리할 때 사용할 수 있다.
BufferReader를 통해 라인 단위로 읽어들이는데 StringTokenizer를 통해 문자열을 여러 개의 토큰으로 분리한다.
자바는 기본적으로 아스키 코드 값이 입력된다.
한 글자씩 입력받아 해당 값의 아스키 코드 값을 반환한다.
(아스키 코드 일부)
\n : 10, 공백 : 32, 0 : 48, 9 : 57, A : 65, Z : 90, a : 97, z : 122
int c, n = System.in.read() & 15;
while((c = System.in.read()) > 32)
n = (n << 3) + (n << 1) + (c & 15)