문제 풀이

[백준] 15552번: 빠른 A+B - JAVA (자바)

auyeol 2023. 1. 23. 15:52
728x90

문제

 

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

 

15552번: 빠른 A+B

첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

www.acmicpc.net

 

A+B할 식의 개수(n개)를 정한 뒤, 두 정수 A와 B를 입력, A+B를 한 결과를 출력하는 문제이다.

 

입출력 방식에 따라서 여러 줄을 입력받거나 출력할 때 시간에 차이가 나기 때문에 

 

Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용해서 문제를 풀어야한다. 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

이전의 10950과 문제 유형은 비슷하다. 

 

https://auyeol-coding.tistory.com/17

 

[백준] 10950번: A+B - 3 - JAVA (자바)

문제 https://www.acmicpc.net/problem/10950 10950번: A+B - 3 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. www.acmicpc.net 두 정수 A와 B를 입력한 뒤, A+B를 한 결과를 출력하는 문제이다

auyeol-coding.tistory.com

 

하지만, 기존의 방식을 활용했을 때, 시간이 초과되어 맞추지 못한다.

 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

Scanner와 BufferedReader에서 속도의 차이가 나기 때문에 발생하는 문제이다.

 

문제에서도 다음과 같이 Scanner 대신 BufferedReader/Writer를 사용하라고 적혀있다.

 

 

 

▶ Scanner 

   > 키를 누르는 즉시 값이 바로 전달된다.

  

   정수 값 int, short, long / 소수 값 float, double / String 값을 구분지어 읽을 수 있음 > 속도가 느리다.

 

   동기화를 사용하지 않는다.

 

 

▶ BufferedReader

   > 입력 받은 값을 버퍼에 담아두었다가 한번에 프로그램에 전송한다. 

 

   문자열 String값 밖에 읽지 못한다. > 속도가 빠르다.

 

   동기화를 사용한다.

 

 

마트에서 장을 보는 것을 예시로 들면,

 

Scanner는 물건을 계산대에 왔다갔다 하면서 하나씩 가져다 주는 것이고,

 

BufferedReader는 카트에 물건들을 담아뒀다가 계산대에 가져다 주는 것이다.

 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

풀이

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter;


public class Main {
	public static void main(String[] args) throws IOException{ // IOException을 통해 예외처리
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine());
		
		for(int i = 0; i<n;i++) {
			String str = br.readLine();
			int a = Integer.parseInt(str.split(" ")[0]);
			int b = Integer.parseInt(str.split(" ")[1]);
			bw.write((a+b)+"\n"); // write는 개행이 안되기 때문에 "\n" 
		}
		br.close();
		bw.flush(); // 남아있는 데이터 모두 출력 
		bw.close();
	}
}

 

Scanner 대신 BufferedReader와 BufferedWriter를 br, bw로 가져온 다음 

 

throws IOException을 통해 예외처리를 설정하였다.

 

이후, 첫번째 줄을 읽게 해서 n에 반복 횟수를 지정시켰다.

 

for문을 통해서 문자열로 읽어지게 설정시킨 다음 공백을 기준으로 자르게 만들어서 0번째 배열에 첫번째 값(a),

 

1번째 배열에 2번째 값(b)을 저장한 다음 a+b를 출력하게 하였다.

 

bufferedWriter는 Write했을 때 개행이 안되기 때문에 \n을 추가하였다.

 

 

 

 

728x90