djm03178   4년 전

https://www.acmicpc.net/board/view/28332 와 비슷한 문제이니 일부 내용을 그대로 다시 쓰겠습니다.

  1. 이 문제의 목적은 파일의 끝(EOF)을 올바르게 판단하는 법을 연습하는 것입니다. 총 몇 줄이 주어진다 등의 정보는 절대 입력으로 주지 않습니다. 또한 단순히 키보드로 입력 내용만 적고 프로그램이 종료되지 않은 상태까지만 봐서는 EOF를 제대로 처리했는지 알 수 없습니다. 더 이상 읽을 게 없을 때 프로그램을 종료하는 법을 알아야 합니다. 그 방법은 언어마다 다르고 사용하는 함수마다 다르니, 구글에 "C언어 EOF" 와 같이 검색해서 그 방법을 알아보세요. 주로 파일 입출력으로 설명되어 있겠지만, 입력 스트림도 파일 입력이기 때문에 결국 동일합니다. 자바의 경우 Scanner와 BufferedReader에서 해야 하는 처리가 서로 다릅니다. 언어를 불문하고, 레퍼런스를 참고해서 사용법을 정확하게 숙지하는 습관을 들이세요.
    1. (C/C++) scanf는 EOF를 반환하지, 변수에 저장해주지 않습니다.
    2. (Java) Scanner의 메서드들은 NoSuchElementException을 던집니다.
    3. (Java) BufferedReader.readLine()은 null을 반환합니다.
    4. (Python) input()은 EOFError를 발생시킵니다.
    5. (Python) sys.stdin.readline()은 빈 문자열을 반환합니다.
  2. 이 문제에 대한 프로그램을 직접 테스트 해보려면 입력 내용을 파일에 저장해 놓고 freopen 등을 이용해서 프로그램에 표준 입력으로 보내주거나, 터미널에서 파이프로 넘겨주나, 또는 직접 키보드로 치다가 컨트롤 Z (윈도우즈), 컨트롤 D (맥, 리눅스) 를 눌러주는 방법이 있습니다. 이상하게도, 윈도우즈의 경우 컨트롤 Z를 여러 번 입력해줘야 인식되는 경우가 있는 것 같습니다.
  3. 입력받은 내용을 모조리 저장해 놓고 나중에 몰아서 출력할 필요가 없습니다. 입력 스트림과 출력 스트림은 별개이므로, 한 케이스 입력받고 그에 대한 답을 구한 뒤 바로 출력하는 것을 반복해도 됩니다. 화면에 입력과 출력이 섞여서 나오는 것은 아무 상관 없습니다.

spearkkk   4년 전

감사합니다. 방향을 잘못잡고 있었는데, 이 글을 읽고 명쾌해졌습니다.

사실 c/c+=으로는 쉽게 접근할 수 있었는데, 코틀린/자바에 대해서는 알아보지 않았는데 딱 정리해주셨네요.

jh05013   4년 전

(Python) sys.stdin.readline()은 빈 문자열을 반환합니다.

를 추가해주세요.

dbfldkfdbgml   3년 전

readLine()이 반환하는 String은 null이 아니라 "" 입니다.

line == null로는 이클립스에서도 오류가 납니다. line.equals("") 조건이 있어야 하며, 다음과 같은 소스는 정답을 받을 수 있습니다.

djm03178   3년 전

null이 맞습니다. null이 아니라면 다음의 코드는 통과되지 못할 것입니다. http://boj.kr/c0059e5f5ca647cf...

https://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html#readLine-- 에도 "or null if the end of the stream has been reached"로 null이 반환됨을 분명하게 명시하고 있습니다.

이클립스에서 동작을 안 했다면 EOF를 올바르게 입력하지 않으신 것이 아닐까 생각합니다. 마지막에 입력 없이 엔터만을 입력했다면 ""가 리턴되는 것이 맞으며, 이는 EOF와는 달리 빈 줄을 입력한 것입니다.

dbfldkfdbgml   3년 전

마지막에 입력 없이 엔터만을 입력했다면 ""가 리턴되는 것이 맞으며, 이는 EOF와는 달리 빈 줄을 입력한 것입니다.

를 생각하지 못하였습니다.

감사합니다!

dltmdals0608   3년 전

유익한 지식 감사합니다.

cconny2002   3년 전

이 참고를 해당 문제에 힌트로 주셨으면 좋겠습니다.

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