[백준, 1000번] 2단계) A+B - JAVA 풀이
백준 [1000번] - A+B
https://www.acmicpc.net/problem/1000
1000번: A+B
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
www.acmicpc.net
# 문제 해설
A와 B를 입력받아 두 값을 더한 결과를 출력하는 것이 목표.
# 풀이 - Scanner 클래스
* Scanner
: 값을 입력받기 위한 클래스
2023.04.12 - [BAEKJOON(백준)/1단계) 입출력과 사칙연산] - [2557번] 1단계) Hello World - JAVA 풀이
[2557번] 1단계) Hello World - JAVA 풀이
* 이러니 저러니 해도 직접 구르는게 최고! 코딩 테스트, 알고리즘, CS... 맨날 생각만 하고 지나가는 하루였기에, 차근차근 조금씩이라도 수행하고 기록을 남겨보려 한다. 백준 [2557번] - Hello World
01-study-for-me.tistory.com
Scanner에 대한 더 자세한 설명은, 이전 문제 풀이에서 확인해보자.
//데이터를 입력받기 위한 클래스
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//선언
Scanner scan = new Scanner(System.in); //System.in -> Byte 단위로 값을 읽음.
int A = scan.nextInt(); //공백을 제외해서 읽음, int값을 받아들임.
int B = scan.nextInt();
// 0 < A,B < 10 조건을 위해 if문을 사용할 수도 있다.
//if((0<A && A<10) && (0<A && A<10)) {
System.out.println(A+B);
//}
//Scanner 사용 후 close()
scan.close();
}
}
기본적으로 사용하는 방법이나, 속도는 느린편에 속한다.
또한, 공백 문자까지도 버퍼에 저장한다. 이러한 처리는 사용하는 메서드에 따라 차이가 있다.
* Scanner의 매서드
메서드 | 기능 |
next() | String |
nextLine() | String, 띄어쓰기 포함. |
nextInt() | int |
nextBoolean() | boolean |
nextByte() | byte |
nextShort() | short |
nextLong() | long |
nextFloat() | float |
nextDouble() | double |
* nextLine()은 다른 메서드와는 다른 특징을 가지고 있다. 이를 참고하여 사용하자.
[ 참고 : [Java] Scanner() 메서드 총정리 ]
+ 추가 풀이 참고 ( https://st-lab.tistory.com/12 )
# 추가 풀이 (1) - BufferReader
* BufferReader
: Scanner와 유사한 기능을 하나,
이는 모든 입력을 Char형으로, 버퍼를 사용해 받는다. 그렇기에 속도에서 매우 유리하다.
Scanner의 경우, 입력을 읽는 과정에서
- 정규 표현식 적용
- 입력값 분할
- 파싱(Parsing) ...
위 과정을 제공하기에 속도에 있어 불리할 수 밖에 없다.
참고) [ BufferedRedaer를 알고 쓰자 ]
방법1. StringTokenizer 사용하기
//BufferedReader를 사용하기 위해 import 한다.
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 read = new BufferedReader(new InputStreamReader(System.in)); //System.in 대신, Stream, Reader, File이 입력될 수 있다.
// (1). String 생성 후 작업하기
String text = read.readLine();
//StringTokenizer - 문자열을 구분자로 쪼개어 저장한다. (토큰(Token) 형태로 저장)
StringTokenizer str = new StringTokenizer(text," ");
//토큰은 문자(문자열) 형태로 출력되기에 int로 변환한다.
int a = Integer.parseInt(str.nextToken());
int b = Integer.parseInt(str.nextToken());
// (2). String 생성 (X), 입력된 데이터를 바로 구분자로 분리하기
/*
StringTokenizer st = new StringTokenizer(read.readLine()," "); // String text = read.redaLine(); + StringTokenizer str = new StringTokenizer(text," ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
*/
System.out.println(a+b);
}
}
방법2. split() 사용하기
//BufferedReader를 사용하기 위해 import 한다.
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 read = new BufferedReader(new InputStreamReader(System.in)); //System.in 대신, Stream, Reader, File이 입력될 수 있다.
//split()을 사용해 한글자씩으로 쪼갬.
String[] str = read.readLine().split(" ");
//문자(문자열) 형태로 출력되기에 int로 변환한다.
int a = Integer.parseInt(str[0]);
int b = Integer.parseInt(str[1]);
System.out.println(a+b);
}
}
* split()을 사용하는 경우, 문자열을 다루고 데이터 양이 많아지게 된다면 StringTokenizer보다 성능이 낮아질 수 있다.
결론적으로 Scanner보다 더 좋은 성능으로 문제를 해결하고자 한다면, BufferedReader를 통해 작업하면 된다.