[백준 #10951] java 문자열 입출력 씹.뜯.맛🦑 4탄 : 입력을 알아서 끝낸다고? 너 누군데? (feat. EOF)

개발하는 튀튀·2025년 1월 20일
post-thumbnail

예.

백준 10951번입니다. 참으로 간단해보이죠?
근데 함정이 있음.


🤔 🤔 ...

1️⃣ 입력값의 개수가 지정되지 않음
2️⃣ 입력을 종료키가 지정되지 않음 ( ex. "@"가 입력되면 입력을 멈춘다

한 마디로 입력이 더 들어오지 않으면 알아서 종료시켜야 채점이 된다는 거다


위 문제는 EOF 개념 을 알아야 풀 수 있다





EOF : End Of File ✋🏻

EOF(End of File)는 파일이나 입력 스트림에서 더 이상 읽을 데이터가 없음을 나타내는 신호야.
즉, 입력이 끝났음을 의미하는 특별한 상태야.


✅ EOF는 언제 발생할까?

  1. 파일을 읽을 때
    → 파일의 끝까지 읽고 나면 EOF 발생.

  2. 키보드 입력을 받을 때
    → 사용자가 입력 종료 키를 누르면 EOF 발생.

  3. 스트림 데이터를 읽을 때
    → 네트워크 소켓, 표준 입력(System.in) 같은 입력 스트림이 더 이상 데이터를 제공하지 않을 때 EOF가 발생.


✅ 자바에서 EOF 감지하는 방법

자바에서는 EOF를 직접 감지하는 기능이 없고, 보통 readLine()이 null을 반환하면 EOF로 간주해.


🔥 1️⃣ BufferedReader로 EOF 처리하기

📌 기본적인 while문을 사용한 EOF 처리

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) { // EOF가 발생하면 null 반환
            System.out.println("입력된 값: " + line);
        }
    }
}

🛠 실행 방법 (터미널에서)

java Main

EOF를 입력하는 방법:

  • Windows: Ctrl + Z 누르고 Enter
  • Mac/Linux: Ctrl + D

🔥 2️⃣ Scanner의 hasNext()를 사용한 EOF 처리

Scanner를 사용하면 hasNext()를 이용해 EOF를 감지할 수 있어.

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while (sc.hasNext()) { // EOF가 발생하면 false 반환
            String input = sc.nextLine();
            System.out.println("입력된 값: " + input);
        }

        sc.close();
    }
}

📌 Scanner.hasNext()를 사용할 때의 장점

  • hasNext()는 파일 입력, 키보드 입력 모두에서 사용할 수 있어.
  • Scanner를 이용하면 공백 단위 입력도 쉽게 처리 가능.

✅ EOF를 사용하는 이유

📌 EOF는 어떤 상황에서 유용할까?

  1. 입력 개수가 정해지지 않은 문제를 해결할 때

    • 입력 개수가 주어지지 않은 문제에서 EOF까지 계속 읽어야 하는 경우.
  2. 파일을 다 읽었는지 확인할 때

    • 파일 끝까지 읽었는지 확인하려면 EOF를 감지해야 함.
  3. 네트워크 소켓에서 데이터 스트림이 종료되었는지 확인할 때

    • 네트워크 연결이 닫혔는지 감지할 때 사용.

🎯 정리

입력 방식EOF 감지 방법
BufferedReaderreadLine() == null
ScannerhasNext() == false

💡 결론:
자바에서는 EOF를 직접 감지하는 방법이 없지만,

  • BufferedReader.readLine() == null 또는
  • Scanner.hasNext() == false

를 사용해서 EOF를 확인할 수 있어! 🚀





문제풀이 ✏️

그렇다고 함.

다음은 활용해서 쓴 나의 코드다.

속도가 느린 느린 scanner()를 쓰고싶지 않아서...

while ((line = br.readLine()) != null) { // EOF를 감지하여 종료

BufferedReader를 활용해서 이렇게 EOF 감지 처리 를 해줌



⬇️ 완성된 나의 코드


import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;

        while ((line = br.readLine()) != null) { // EOF를 감지하여 종료
            StringTokenizer st = new StringTokenizer(line);
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            System.out.println(a + b);
        }
    }
}
profile
행복, 사랑, 건강, 개발, 하세요 !

0개의 댓글