이슈:
각 언어별 EOF가 발생했을 때 어떻게 다루어야 하는지에 대한 궁금증
해결:
BOJ 내 Q&A의 설명은 다음과 같다.
이 문제의 목적은 문자열을 올바르게 입력받고 파일의 끝(EOF)을 올바르게 판단하는 법을 연습하는 것입니다. 총 몇 줄이 주어진다 등의 정보는 절대 입력으로 주지 않습니다. 또한 단순히 키보드로 입력 내용만 적고 프로그램이 종료되지 않은 상태까지만 봐서는 EOF를 제대로 처리했는지 알 수 없습니다. 더 이상 읽을 게 없을 때 프로그램을 종료하는 법을 알아야 합니다. 그 방법은 언어마다 다르고 사용하는 함수마다 다르니, 구글에 "C언어 EOF" 와 같이 검색해서 그 방법을 알아보세요. 주로 파일 입출력으로 설명되어 있겠지만, 입력 스트림도 파일 입력이기 때문에 결국 동일합니다. 자바의 경우 Scanner와 BufferedReader에서 해야 하는 처리가 서로 다릅니다. 언어를 불문하고, 레퍼런스를 참고해서 사용법을 정확하게 숙지하는 습관을 들이세요.
(C/C++) scanf는 EOF를 반환하지, 변수에 저장해주지 않습니다.
(Java) Scanner의 메서드들은 NoSuchElementException을 던집니다.
(Java) BufferedReader.readLine()은 null을 반환합니다.
(Python) input()은 EOFError를 발생시킵니다.
(Python) sys.stdin.readline()은 빈 문자열을 반환합니다.
이 문제에 대한 프로그램을 직접 테스트 해보려면 입력 내용을 파일에 저장해 놓고 freopen 등을 이용해서 프로그램에 표준 입력으로 보내주거나, 터미널에서 파이프로 넘겨주나, 또는 직접 키보드로 치다가 컨트롤 Z (윈도우즈), 컨트롤 D (맥, 리눅스) 를 눌러주는 방법이 있습니다. 이상하게도, 윈도우즈의 경우 컨트롤 Z를 여러 번 입력해줘야 인식되는 경우가 있는 것 같습니다.
입력받은 내용을 모조리 저장해 놓고 나중에 몰아서 출력할 필요가 없습니다. 입력 스트림과 출력 스트림은 별개이므로, 입력받자마자 바로 출력해도 됩니다. 한 글자 단위로도 상관 없고, 한 줄 단위로도 상관 없습니다.
불필요한 것들을 출력하면 틀립니다. 대표적으로, 매 줄마다 무조건 100글자를 출력하는 프로그램은 무조건 틀립니다. 입력받은 내용이 아닌 부분은 절대 출력하려 해서는 안 됩니다. 특히 널 문자는 일부 환경에서 공백과 비슷하게 출력되어 눈치채지 못하는 경우가 많은데, 널 문자도 엄연히 하나의 문자이며 이를 출력했을 경우 무조건 오답이 됩니다.
100글자가 있는 한 줄을 통째로 입력받으려면 최소한 101칸이 있어야 됩니다. 마지막에 널 문자를 끼워넣어주기 때문입니다. 또한 fgets처럼 개행 문자까지 넣어주는 함수의 경우, 최소 102칸이 필요합니다. fgets에 넘겨주는 읽어들일 글자의 수 역시 최소 102여야 합니다.
입력으로 들어오는 총 문자의 수는 최대 101(100+개행) * 100 = 10100자입니다.
파이썬에서는 input()은 EOF 에러를 발생시키기 때문에, except 를 통해 예외처리를 하여 정상적으로 프로세스를 종료할 수 있는 반면 sys.stdin.readline()은 빈문자열 발생으로 입력초과를 만들어낸다는 설명이다.
퍼포먼스 이유로 input()이 아닌 다른 것을 써야한다면? sys.stdin.read()를 사용한다. readline()과 달리 개행을 만들지 않기 때문!
반응형
'기초 튼튼 > 코테준비' 카테고리의 다른 글
[코테준비] Java에서 BufferReader와 BufferWriter 활용 입출력 (0) | 2020.09.18 |
---|---|
[코테준비] Python 해커랭크(HackerRank) 문제풀이 - 4 (2D Array) (1) | 2020.06.01 |
[코테준비] Python 해커랭크(HackerRank) 문제풀이 - 3 (Jumping on the Clouds) (0) | 2020.05.22 |
[코테준비] Python 해커랭크(HackerRank) 문제풀이 - 2 (Counting Valleys) (0) | 2020.05.21 |
[코테준비] Python 해커랭크(HackerRank) 문제풀이 - 1 (Socks Merchant) (0) | 2020.05.19 |