728x90

https://www.acmicpc.net/problem/10951

 

10951번: A+B - 4

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

 

풀이

백준 알고리즘 10950번 : A+B - 3 문제와 유사한 문제이다.

다른 점은 프로그램이 끝나는 방식이다. 이 문제는 위 문제와 달리 입력을 받지 않으면 프로그램을 종료해야 한다.

이 조건을 해결하는 것이 조금 까다로웠다. 이를 해결하기 위해서는 EOF를 알아야 한다.

 

EOF란 End of Files의 약자로, 더 이상 읽을 데이터가 없다는 것이다.

이 문제를 해결하려면 EOF를 처리해야 하는데, 자바에서 이를 처리하는 방법 중 BufferedReader 클래스를 이용한 방법을 사용할 것이다.

 

BufferedReader 클래스에서 EOF를 처리하는 방법은 아래와 같다. (br : BufferedReader 객체)

while ((s = br.readLine()) != null) {
    
}

EOF가 발생하면, BufferedReader 클래스의 readline() 메서드를 사용할 시 null이 입력된다.

따라서 while문의 조건에 위 코드를 작성하면 EOF가 발생했을 때 while문이 종료된다.

 

이를 이용하면 백준 알고리즘 사이트에서는 정답으로 처리되는데, 자바 컴파일러에서는 NoSuchElementException이 발생한다.

해당 Exception이 발생하는 이유는, 컴파일러에서는 enter을 눌렀을 때 readLine() 메서드에 null이 입력되는 것이 아니라 ""문자열(길이가 0인 문자열)이 입력되기 때문이다.

따라서 while문의 조건이 true가 돼서 StringTokenizer을 이용할 때 입력받은 문자가 없기 때문에 NoSuchElementException이 발생하는 것이다.

 

필자는 컴파일러에서도 오류가 뜨지 않게 하고 싶어서 StringTokenizer 클래스의 hasMoreTokens() 메서드를 추가로 사용하였다.

hasMoreTokens() 메서드는 입력받은 문자가 있을 때 true를, 없을 때 false를 반환하기 때문에 위 상황에서 발생하는 NuSuchElementException을 해결할 수 있다.

 

위 과정을 간단히 코드로 나타내면 아래와 같다. (br : BufferedReader 객체, st : StringTokenizer 객체)

while ((s = br.readLine()) != null) {
    if(st.hasMoreTokens()) {
    } else break;
}

 

위 방법을 사용하면 백준에서도 정답 처리가 되고, 컴파일러에서도 오류가 발생하지 않는다.

 

코드

BufferedReader 클래스 StringBuilder 클래스를 이용한 코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
        String s;

        while ((s = br.readLine()) != null) {
            st = new StringTokenizer(s);
            if(st.hasMoreTokens()) {
                int A = Integer.parseInt(st.nextToken());
                int B = Integer.parseInt(st.nextToken());
                sb.append(A + B).append("\n");
            } else break;
        }
        System.out.println(sb);
    }
}

틀린 부분이 있다면 정정해주시면 감사하겠습니다.
궁금한 부분이 있거나, 다른 아이디어가 있으시면 자유롭게 댓글 남겨주세요!

728x90

+ Recent posts