3745번 - 오름세
문제가 무었인지 알아냈습니다. 잘 풀어서 정답 냈습니다.
BufferedReader, BufferedWriter의 특성을 좀더 고민했어야 하네요.
해당 문제는 TestCase가 주어진게 아니고, 입력값에 따라 TestCase가 결정되기 때문에
위에 작성해주신대로 코드가 나오게 되죠. 이때 문제가 (Scanner와 달리, hasNext 같은 함수가 없기때문에), 실질적으로는 무한루핑(While에서 br.read)을 기다리는 형태가 되네요... 어째껀 그런 상태가 되더라도..
정답이 출력되어야하는데. bw.write()을 해도 사실 bw.flush()을 하기 전까지는 답이 출력되지 않네요...
따라서 제가 계속 실패 했던 코드에서는 while문 내에서 bw.flush을 하지 않은 문제점 때문에 실패 처리된게 아닌가 하네요...
BOJ 채점시 출력결과는 아무때나 출력해도 상관 없습니다.
위에 주신 코드는 각 테스트케이스마다 결과가 도출되며 바로 flush() 해서 출력하는 형태이지만
BufferedWriter는 close() 할 때 쌓아둔 모든 출력을 내보냅니다.
아마 이전에 작성했을 때 틀린 이유가 write를 하고, while문 바깥에서 프로그램이 종료할 때 close()를 안해주신게 아닐까 합니다.
또 주의해야 할 점은 write()를 할 때 반드시 String으로 해야합니다.
Integer를 write()하면 제대로 출력이 되지가 않습니다...
String.valueOf()를 사용하신 것을 보니 이미 알고계신듯 합니다! (혹시나 다른 분들이 이 질문을 본다면 꼭 참고해주시길!!)
아래 코드를 참고하세요! (제출해봤는데 맞았네요!)
댓글을 작성하려면 로그인해야 합니다.
gseok 6년 전 2
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번 오답 하고 찾았네요...