본문 바로가기

Language/JAVA

입력 읽기

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()메소드를 사용하는 것이 좋습니다.