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를 알리는 코드를 작성하지 않아도 된다.
참고 :
728x90
'넓고 얕은 자료구조 & 알고리즘 > JAVA 알고리즘 문제를 위한 스킬' 카테고리의 다른 글
Map - getOrDefault 메서드 (0) | 2023.03.24 |
---|---|
다이내믹 프로그래밍(DP, 동적 프로그래밍) 1분 요약 정리 (0) | 2023.03.14 |
자바에서 문자열 곱하기 하는 방법 .repeat() (0) | 2023.02.12 |
우선순위 큐(Priority Queue) (0) | 2022.11.06 |
정규표현식을 이용한 문자열에서 숫자 분리 (0) | 2022.10.20 |