gseok   6년 전

Java 구현시 완전 동일한 LIS 로직을 구현해도 무조건 runtime exception 이  발생합니다.

runtime exception의 발생 조건은

BufferedReader, BufferedWriter, StringTokenizer 이중 하나라도 들어있으면 완전 동일로직에서 runtime exception이  발생하여서 오답 처리됩니다.

문제 자체에 입력을 Scanner로 고정해야 한다는 조건이 없고, 문제를 parsing 하는 부분역시 그런 조건이 없습니다.

현재 백준에서는 runtime exception시 힌트가 하나도없기 때문에 정상적인 로직을 구현한 경우 이를 찾아서 수정하기가 매우 어렵습니다.

Java로 3745 오름세 문제를 푸시는 분들은

Scanner로 입력을 받고, 해당 클래스의 hasNext, nextInt 등의 함수만 사용해서 파싱하고,

출력은 System.out.println을 사용하여야 합니다.

(BufferedReader, BufferedWriter, StringTokenizer) 사용시 문제에 대한 로직이 아니라, 입출력 관련으로 에러가 발생합니다.

해당 문제, 담당자, 혹은 출제자는, Java구현자를 위해서 이 부분을 수정하거나, 문제에 명시가 필요해 보입니다.

이거 때문에 30번 오답 하고 찾았네요...

djm03178   6년 전

아마 줄의 끝에 공백 문자가 하나 들어있어서 발생한 상황이 아닐까요? 그런 경우가 자주 있는 것 같습니다.

isku   6년 전

BufferedReader로 입력을 읽을 때 .trim() 함수를 사용하셨나요?

또 입력 종료에 대해서 null 체크를 하셨는지요..?

아래 코드를 참고하세요!


gseok   6년 전

둘다 했는데 발생합니다.

djm03178   6년 전

문제가 발생한 코드를 올려주셔야 입력 파일의 상태를 파악하기 용이할 것 같네요. Scanner로만 가능하게 문제를 만들었을 리는 없고, 문자열 전체를 받아와서 분석하는 데에 불순물이 들어있어서일 테죠.

gseok   6년 전

문제가 무었인지 알아냈습니다. 잘 풀어서 정답 냈습니다.

BufferedReader, BufferedWriter의 특성을 좀더 고민했어야 하네요.

해당 문제는 TestCase가 주어진게 아니고, 입력값에 따라 TestCase가 결정되기 때문에

위에 작성해주신대로 코드가 나오게 되죠. 이때 문제가 (Scanner와 달리, hasNext 같은 함수가 없기때문에), 실질적으로는 무한루핑(While에서 br.read)을 기다리는 형태가 되네요... 어째껀 그런 상태가 되더라도..

정답이 출력되어야하는데. bw.write()을 해도 사실 bw.flush()을 하기 전까지는 답이 출력되지 않네요...

따라서 제가 계속 실패 했던 코드에서는 while문 내에서 bw.flush을 하지 않은 문제점 때문에 실패 처리된게 아닌가 하네요...


isku   6년 전

BOJ 채점시 출력결과는 아무때나 출력해도 상관 없습니다.

위에 주신 코드는 각 테스트케이스마다 결과가 도출되며 바로 flush() 해서 출력하는 형태이지만


BufferedWriter는 close() 할 때 쌓아둔 모든 출력을 내보냅니다.

아마 이전에 작성했을 때 틀린 이유가 write를 하고, while문 바깥에서 프로그램이 종료할 때 close()를 안해주신게 아닐까 합니다.


또 주의해야 할 점은 write()를 할 때 반드시 String으로 해야합니다.

Integer를 write()하면 제대로 출력이 되지가 않습니다...

String.valueOf()를 사용하신 것을 보니 이미 알고계신듯 합니다! (혹시나 다른 분들이 이 질문을 본다면 꼭 참고해주시길!!)


아래 코드를 참고하세요! (제출해봤는데 맞았네요!)

gseok   6년 전

while 문 밖에서 br.close(), bw.flush(), bw.close() 을 모두 불렀었습니다....

gseok   6년 전

물론 String.valueOf로 String 형태는 맞추어 주었고요...

gseok   6년 전

처음에 당연히 while문 밖에서 bw.flush(), bw.close()을 했었기 때문에 문제가 없었다고 생각했습니다.

while문 밖에서 flush, close을 했음에도 문제가 발생했었습니다... 음.. 다시 해보니  잘 되네요... 수정이 된건지..ㅡ.ㅡ....

trim 때문이었나..ㅡ.ㅡ;;;; 아무튼 감사합니다.

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