gomguk   5년 전

안녕하세요? 지금까지 있었던 질문글들을 처음부터 끝까지 전부 훑고, FAQ에 맞추어 코드를 수정하고 여러 반례들로 테스트 해보았으나 출력 초과 결과의 끝이 보이질 않아 부득이하게 질문 올리게 되었습니다...

수정한 부분, 확인한 부분은 다음과 같습니다.

  • LinkedList였던 stack 구조를 빠른 동작을 위해 ArrayList로 변경
  • int로 사용중이었던 데이터 형식을 전부 Integer로 변경하고, int형 비교가 필요한 부분은 intValue()를 사용
  • 불가능한 상태일 경우 NO로 제대로 출력되고 있는지 확인
  • 불가능한 상태일 경우 NO 외의 다른 것이 출력되는지 반례들을 통해 테스트

도대체 어느 부분을 놓치고 있는 것일까요?

보통은 올려주신 질문글들을 읽다보면 깨달음을 얻고 해결이 되던데, 이 문제만큼은 도저히 답이 나오질 않네요...ㅠ_ㅠ

고수분들의 도움 부탁드리겠습니다!

djm03178   5년 전

BufferedWriter에서 flush를 하지 않더라도 write를 하는 순간 그 출력은 돌이킬 수 없는 듯 합니다.

이클립스 상에선 화면에 보이지는 않는데, 어쩌면 출력량이 일정 이상이 되면 자동으로 flush를 할 수도 있고 정확한 원인은 모르겠습니다.

BufferedWriter에 직접 쓰는 대신 StringBuilder로 문자열을 만들고 마지막에 한 번만 출력하니 정답을 받았습니다.

isku   5년 전

64번째 줄 부분이 이상해보이네요.

System.in과 System.out과 같은 입출력 Stream은 2번 이상 사용할 경우 예기치 못한 일들이 발생할 수 있습니다.

이미 main의 첫 줄에 BufferedWriter를 선언하고,

알고리즘 부분에서 이를 잘 사용하다가, 왜 다시 선언해서 사용하는지 코드를 자세히 보지 않아 의도는 잘 모르겠지만,

가장 의심되는 부분입니다.

djm03178님 말처럼, BufferdWriter는 Buffer에 쓸 내용이 꽉차면 알아서 flush()를 하게 됩니다. 그 기본값은 8192이고 임의로 설정 가능합니다.

제가 이 문제를 풀지는 않아서 출력량이 얼마나 되는지 잘 모르지만;

Buffer에 쓸 내용이 순서대로 잘 들어갔다면 아무때나 flush()가 일어나도 정답과는 무관합니다. (시간에는 영향이 있습니다)

그러니 출력해야 할 순서가 정답과 일치하는지 고민하여 64번 줄을 수정 할 필요가 보입니다.

 

gomguk   5년 전

@djm03178 @isku

두 분 친절한 답변 정말 감사드립니다! 

BufferedWriter에 대한 저의 지식 부족이 핵심 원인이었군요ㅠ_ㅠ

bw = new BufferedWriter()를 다시 하게 된 이유는, 기존에 write()하고 있던 +와 - 문자열을 사용하지 않고 아예 새로운 BufferedWriter를 할당해 "NO"라는 문자열만 출력하고자 하는 것이 의도였습니다.

두 분께서 말씀해주신 대로, Buffer에 내용이 많이 차면 알아서 flush()를 하는 것때문에 Buffer에 담고 있는 내용이 길어질 경우에 출력 초과가 났을 가능성이 가장 큰 것 같습니다ㅠ_ㅠ

BufferedWriter에 대한 공부도 날 잡아서 깊게 해봐야겠다는 생각이 드네요. 명확한 답변 정말 감사합니다!

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