citizen   7년 전

시간초과 문제 때문에 어쩔 수 없이 

Scanner를 쓰면 안된다는 것까지는 알겠는데요..

BufferedReader를 쓸 때

read()와 readLine() 두 가지를 사용할 수 있는데

둘 다 예제를 그대로 입력창에 복사 붙여넣기 하면

read()는 출력을 안하고 계속 입력상태에 머물고 있고

readLine() 같은 경우는 오류가 나버립니다.


BufferedReader 어떻게 써야 이 문제 풀 수 있나요?

occidere   7년 전

이미 해결하셨을수도 있지만 혹시나 해서 올려봅니다.


일반적으로 BufferedReader 를 통해 입력받을때 유의하셔야 할 점이 몇가지 있습니다. 

1. 기본적으로 BufferedReader는 한 줄을 통째로 입력받는 방법으로 주로 쓰입니다.

2. readLine() 메서드는 값을 읽어올 때, String값으로 개행문자(엔터값)를 포함해 한줄을 전부 읽어오는 방식입니다.

 - 비슷한 예로 Scanner메서드 중 nextLine()도 스트링 값과 개행문자(엔터값)을 같이 읽어옵니다.(반면 next()는 개행문자는 제외하고 스트링 값만 읽어옵니다.)

 - 예제의 입력 예제를 보면 각 문장이 모두 개행문자(엔터)로 구별되있는것을 확인하실 수 있습니다. 따라서 이 문제에서 개행문자를 입력받는것은 필수입니다!

3. read() 메서드는 값을 읽어올 때, int값으로 변형하여 읽어오는 방식입니다. 

 - 예를들어 input.txt에 저장된 1이라는 숫자를 read()를 통해 읽어오면  int형 숫자 1을 읽어오는 것이 아닌, txt형식으로 저장된 ASCII 형식의 문자값 '1'을 읽어오는 것이므로 결국 int값으론 49를 읽어오는 것이 됩니다. 

 - 이를 해결하려면 int a = br.read() - 48; br.readLine(); 을 하여 ASCII 값에서 뻴셈을 이용한 뒤 엔터 값을 읽어오거나, int a = Integer.parseInt(br.readLine()); 를 통해 엔터값을 포함해 한줄을 통째로 입력받은 뒤 해당 스트링값을 int로 형변환 해주는 방법이 있습니다. (저같은 경우에는 주로 후자의 방법을 사용합니다)


위의 3가지를 고려하여 코드를 수정하니 정상 제출이 됩니다!

citizen   7년 전

친절한 답변 감사드립니다.

댓글을 작성하려면 로그인해야 합니다.