Algorithm/Baekjoon

[백준] 10951번 : A + B - 4 - Java

unknownomad 2022. 2. 23. 15:42

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

 

10951번: A+B - 4

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

www.acmicpc.net



주의점

  • 두 정수 : 공백으로 구분되어 입력됨
  • 테스트 종료 기준 : 더 이상 읽을 수 있는 데이터가 없을 때(EOF)

구현 방법

1. Scanner + System.out.println()

2. BufferedReader + StringTokenizer + StringBuilder

  • 자료형 타입 주의
  • st.nextToken(): 문자열 반환하기에, Integer.parseInt()로 int형으로 변환시켜야 함

3. BufferedReader + String.charAt() + StringBuilder

  • 입력 숫자 범위 : 한 자리 수
    공백 위치가 고정됨 ➡ String.charAt() 활용하여 성능 높이기
    해당 문자의 아스키코드 값 반환 ➡ 정수 형태로 변경 위해 - 48 또는 - '0' 추가해야 함

EOF (End Of File)

정의

  • 데이터가 더이상 존재하지 않을 때 = 파일의 끝

이번 문제

  • 파일 종료 조건 없이 그냥 입력이 주어짐
  • 입력에서 읽을 수 있는 데이터가 더는 존재하지 않을 시 반복문 종료

1. Scanner

  • 읽을 데이터가 더 없을 시 NoSuchElementException 발생

1.1. 해결 방법

  1. try-catch문으로 반복문 종료
  2. Scanner 메소드인 hasNext()로 종료

1.2. 주의점

1.2.1. 백준

데이터 입력 시 더 이상 데이터 내보내지 않으면 NoSuchElementException 발생
But 일반적인 입력 방법인 System.in, 즉 키보드로 입력받을 경우
Scanner는 공백/엔터에도 입력 예외 발생 X(데이터로 받아들임)

일반 입력 방식으로 예외처리를 하려면
\n 을 입력받거나 " "(공백)을 입력받을 경우의 조건문을 걸어 예외 발생 후 종료시켜야 하지만
백준의 경우, 파일 입력 시 종료 시점에서 더 이상 데이터를 보낼 수가 없기에 예외 발생
백준은 hasNext(), hasNextInt() 등 메소드로 처리해도 문제 해결됨
(더 읽을 데이터가 없는경우 nextInt()에서 받는 입력이 존재하지 않기에 예외 발생)

 

1.2.2. IDE나 터미널에서 입력 시

공백/엔터 입력 시 입력 이벤트로 데이터가 스트림에 넣어짐 ➡ 예외 발생 X
반복문 종료하려면 hasNextInt()에서 EOF 입력(윈도우: Ctrl + Z / 리눅스: Ctrl + D)
정수 아닌 문자열 입력 등 다른 타입값을 입력해 InputMismatchException 발생시켜야 함

2. BufferedReader

  • null 반환 ➡ null 유무만 조건문 통해 확인하면 됨
  • BufferedReader로 null 반환하려면 EOF를 던져주어야 하기에 Ctrl + Z (윈도우) / Ctrl + D (리눅스) 입력해야 함

풀이

1. Scanner + System.out.println()

  • 이 문제에서는 hasNextInt(), hasNext() 둘 다 사용 가능
    입력이 아예 들어오지 않기에 예외 발생하는 형태가 동일하기 때문
    But nextInt()로 정수를 입력받기 위해 hasNextInt() 사용 권장
  • hasNextInt()
    입력값이 정수면 true 반환
    정수 아니면 예외 발생 + 더 이상 입력받지 않고 hasNextInt()에서 false 반환 + 반복문 종료
import java.util.Scanner;
 
public class Main {
    public static void main(String args[]){
		
        Scanner in = new Scanner(System.in);
			
        while(in.hasNextInt()) {
            int A = in.nextInt();
            int B = in.nextInt();
            System.out.println(A + B);
        }
        in.close();
    }
}

2. BufferedReader + StringTokenizer + StringBuilder

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
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 str;
 
        while((str = br.readLine()) != null) {    
            st = new StringTokenizer(str, " ");
            int A = Integer.parseInt(st.nextToken());
            int B = Integer.parseInt(st.nextToken());
            sb.append(A + B).append("\n");
        }
        System.out.print(sb);
    }
}

 

3. BufferedReader + String.charAt() + StringBuilder

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
public class Main {
    public static void main(String args[]) throws IOException {
		
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        String str;
 
        while((str = br.readLine()) != null){    
            int A = str.charAt(0) - 48;
            int B = str.charAt(2) - 48;
            sb.append(a+b).append("\n");
        }
        System.out.print(sb);
    }
}

성능

  • BufferedReader + String.charAt() + StringBuilder
  • BufferedReader + StringTokenizer + StringBuilder
  • Scanner + System.out.println()

 


출처 : https://st-lab.tistory.com/39