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. 해결 방법
- try-catch문으로 반복문 종료
- 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()