✍ 백준 3765


줄마다 수식을 입력하면 그대로 출력하는 문제이다. (문제는 원문을 gpt로 번역하였다.)
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
while (true) {
String line = br.readLine();
if (line.isEmpty()) break; // 빈줄일때 break
sb.append(line + "\n");
}
sb.deleteCharAt(sb.length() - 1);
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}
while문을 이용하여 한줄씩 읽고 빈줄일때 isEnpty()
메서드로 나가게 해서 출력하는 방식으로 짰다.

IntelliJ에서는 실행이 잘되었는데, 백준에선 NullPointerException 에러가 떠버렸다..
그래서 찾다보니 EOF 때문이라는 것을 알게 되었다.
📌 EOF (End of File)
입력의 끝
더 이상 읽을 데이터가 없다는 신호
Windows 에서는
Ctrl + Z
, Linux/Mac/IntelliJ 에서는Ctrl + D
를 통해 신호를 보낼 수 있다.
입력의 대표적인 클래스 Scanner와 BufferedReader에서의 EOF를 알아보자.
Scanner
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) { // 더 이상 읽을 값이 없으면 false 반환
String input = sc.nextLine();
System.out.println("입력: " + input);
}
sc.close();
}
}
Scanner의
hasNext()
또는hasNextLine()
메서드는 EOF를 감지할 수 있어서 더 이상 읽을 값이 없으면 false를 반환하여 while문을 벗어난다.여기서
Ctrl + D
를 누르면 EOF신호를 보내고 입력을 마칠 수 있다.
BufferedReader
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = br.readLine()) != null) { // readLine()이 null을 반환하면 EOF
System.out.println("입력: " + line);
}
System.out.println("EOF 도달, 프로그램 종료!");
}
}
BufferedReader는 EOF에 도달하면
readLine()
에 null을 반환하게 된다.그래서 line이 null일때 while문을 벗어나는 조건으로 많이 쓰인다.
여기서
Ctrl + D
를 누르면 EOF신호를 보내고 입력을 마칠 수 있다.
백준과 같은 온라인 저지 시스템에서 주로 파일 입력(또는 스트림 입력) 방식으로 동작하기 때문에 EOF 처리를 자동으로 해준다.
그렇기 때문에 EOF신호를 받은 while문에서 EOF처리를 해줘야 하는것이다.
다음은 EOF처리를 한 코드이다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
while (true) {
String line = br.readLine();
if (line == null || line.isEmpty()) break; // EOF와 빈줄 처리
sb.append(line + "\n");
}
sb.deleteCharAt(sb.length() - 1);
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}
이렇게 하면 EOF처리와 빈줄까지 처리가 가능하다.
while문 안에서 (line = br.readLine()) != null || line.isEmpty() 로 처리해 주어도 상관없다.
📚마무리
더 이상 읽을 데이터가 없으면, 입력의 끝에 해당하는 EOF 신호를 보낼 수 있다.
Scanner는 hasNext()나 hasLine()을 false로, BufferedReader는 readLine()을 null로 반환한다.
백준과 같은 시스템은 파일입력방식으로 동작해 EOF 신호를 자동으로 보내주기 때문에 꼭 처리해 주어야 한다.