입력 읽기
JAVA를 사용하여 알고리즘 문제를 풀 때 시간 초과가 발생하는 경우가 종종 있습니다..
아무리 소스를 훑어봐도 시간이 오래 걸리는 부분이 없는 거 같은데... 왜 그럴까 생각을 해봤습니다.
키보드를 통한 입력을 받을 때 Scanner를 사용하는데
이것이 원인이 아닐까라는 생각이 들었습니다.
그래서 Scanner 말고 다른 방법을 찾아볼 겸
Java 입출력에 대해 정리를 해보고자 합니다!
Scanner
Scanner scanner = new Scanner(System.in);
String next = scanner.next();
String nextLine = scanner.nextLine();
int num = scanner.nextInt();
next()는 공백(' ')을 기준으로 공백 전까지의 문자열을 입력 받습니다.
입력 => 안녕하세요 저는
결과 => 안녕하세요
nextLine()은 Enter를 입력하기 전까지의 문자열을 입력 받습니다.
입력 => 안녕하세요 저는
디노입니다.
결과 => 안녕하세요 저는
nextInt()는 공백(' ')을 기준으로 공백 전까지 입력받는 것은 next()와 똑같지만 문자열이 아닌 숫자를 입력 받습니다.
입력 => 10 20
결과 => 10
BufferedReader
BufferedReader는 입력 소스로부터 자신 내부 버퍼 크기만큼 데이터를 미리 읽고 버퍼에 저장합니다.
외부의 입력 소스로부터 직접 읽는 대신 버퍼로부터 읽기때문에 읽기 성능이 향상됩니다.
Reader reader = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(reader);
String inputStr = br.readLine();
readLine()은 '\r', '\n' 구분된 행 단위의 문자열을 읽을 수 있습니다.
그렇기 때문에 입력받은 문자열을 한 종류의 구분자를 기준으로 나눠야하는 경우가 발생하게됩니다. 그럴때는
StringTokenizer 클래스를 사용하면 손쉽게 분리할 수 있습니다.
StringTokenizer
StringTokenizer st = new StringTokenizer("문자열", "구분자");
while (st.hasMoreTokens())
{
st.nextToken();
}
hasMoreTokens()은 남아 있는 토큰의 여부 값을 return합니다.
nextToken()은 토큰 값을 하나씩 꺼내옵니다.
더 이상 꺼내올 수 있는 토큰이 없는 경우 NoSuchElementException()이 발생하기 때문에 hasMoreTokens() 메소드를 이용하여 토큰을 꺼낼 수 있는지 조사 후 nextToken()메소드를 사용하는 것이 좋습니다.