본문 바로가기
넓고 얕은 자료구조 & 알고리즘/JAVA 알고리즘 문제를 위한 스킬

자바 EOF(End of File) 처리 방법 1분 요약(백준 10951)

by 팡펑퐁 2023. 2. 21.
728x90

백준 10951

  • 언뜻 보면 굉장히 단순해 보이는 문제이다. 

 

  • 그런데, 예제 입력을 자세히 보면 일반적인 문제처럼 테스트 케이스 수를 입력받지 않는다.
  • 잉? 그럼 입력이 종료되는지 어떻게 알지?
  • 일단 백준에서는 어떻게 처리되겠지라고 생각했다.
  • 그래서 IntelliJ에서는 데이터 입력이 끝이 났다는 것을 어떻게 표현할까에 대해서만 생각했다.

 

        while (true) {
            try {
                String str = br.readLine();
                StringTokenizer st = new StringTokenizer(str);

                int A = Integer.parseInt(st.nextToken());
                int B = Integer.parseInt(st.nextToken());
                bw.write(A + B + "\n");
            } catch (NullPointerException e) {
            	break;
            }
  • 대표적인 NullPointerException을 처리하는 방법인 try-catch문을 사용했다. 
    • try 문 안에서 NullpointerException이 발생하면 catch 문에서 break를 거는 것이다.
    • 결과는 성공! 정답 처리가 되었다.
    • 그러나, 이 방법은 IntelliJ에서는 에러를 발생시킨다.
      • 더 이상의 입력 데이터가 없다는 것을 알리기 위해 입력 값없이 엔터를 누르게 되면 에러가 발생한다.
  • 백준과 IDE를 모두 통과할 방법을 찾다가 EOF란 개념을 알게 되었다.

 

📌 EOF(End of File)

  • 데이터 소스로부터 더 이상 데이터를 읽어 들일 수 없는 상태를 의미한다.
  • EOF를 만날 수 있는 대표적인 문제는 백준 10951번이다.

 

 

💡 대표적인 해결 방법

Scanner 이용

Scanner sc = new Scanner(System.in);

// hasNextLine()이 false인 경우 반복문 탈출
while(sc.hasNextLine()) {			
	String str1 = sc.nextLine();
}

// hasNextInt()이 false인 경우 반복문 탈출
while(sc.hasNextInt()) {			
	int num1 = sc.nextInt();
}
  • 보통 알고리즘 문제를 풀 때는 BufferedReader를 사용하므로 설명은 생략한다.

 

BufferedReader 이용

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = "";

// 1
while( (str=br.readLine()) != null ) {}

// 2
while ( (str = br.readLine()) != null && !(str.isEmpty()) ) {}
  • 1번의 경우 백준에서 EOF 처리가 가능하다.
    • 데이터가 없는 경우(null인 경우) while 문이 종료된다.
    • 그러나, IDE에서는 위의 try-catch 문과 마찬가지로 에러를 발생시킨다. 
  • 2번의 경우 !(str.isEmpty()) 조건을 추가해 줌으로써 IDE에서도 값을 입력하지 않고 엔터를 눌러도 에러 없이 정상 작동된다.

 

 

정리

  • IntelliJ 등의 IDE에서는 터미널 창을 통해 입력값을 입력받는다.
  • 때문에 더이상 입력을 하지 않는 방식으로는 입력의 끝을 컴퓨터에게 알려줄 수 없다.
  • 따라서 EOF라는 것을 명시하기 위해 str.isEmpty()와 같은 조건을 추가하여, 값을 입력하지 않고 엔터를 누르는 방식으로 프로그램을 종료시킬 수 있다.
  • 백준과 같이 입력 데이터 파일로 테스트를 하는 경우에서는 파일의 끝이 입력의 끝이므로 별도로 EOF를 알리는 코드를 작성하지 않아도 된다.

 

 

참고 :

https://gre-eny.tistory.com/307

728x90