[백준 15552번] 빠른 A + B

Bzeromo·2023년 7월 24일
0

BaekJoon

목록 보기
1/3
post-thumbnail

15552번 문제: 빠른 A + B


그냥 문제만 보면 초보자도 매우 쉽게 풀 수 있을 듯하다.
테스트 케이스와 덧셈 연산에 쓰일 두 숫자를 반복해서 입력받고 결과 값을 출력하면 되는 문제이다.
다만, 이 문제에는 시간 제한이 걸려있다.
그래서 입출력시 일반적으로 사용하던 ScannerSystem.out.println();는 사용하지 못한다.
이를 이용해서 입출력을 처리하면 시간 제한을 죽어도 맞출 수가 없다.

우리는 이제 입출력에 있어서 더 효율적인 것을 사용할 차례이다.


1. BufferReader와 IOException

BufferReader는 기존의 Scanner와 유사하다.
BufferReader와 BufferWritter는 스트림이라는 것을 이용하는데, 이것이 입출력에서의 효율을 끌어올린다.

(스트림의 자세한 원리는 나중에 다룬다...)

우선 BufferReader와 입력 스트림 리더(InputStreamReader)를 import로 불러와야한다.
스트림을 사용할 때에는 반드시 입출력에 대한 예외처리를 해주어야한다.
사용할 때마다 try-catch를 사용하는 방법도 있지만, 간단하게 throws를 이용하는 방식이 널리 쓰인다. 예외처리를 위해서 이 역시 import를 필요로 한다.

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

이 녀석은 입력값을 받을 때 반드시 문자열로만 읽어들이기 때문에 받은 값을 다른 자료형으로 사용하고 싶다면 반드시 형 변환을 해줘야 한다.

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());

문자열을 받았을 때, Enter를 기준으로 나누기 때문에 공백문자를 포함한다.
그렇기 때문에 숫자를 여러 개 받는다든지 할 때에는 StringTokenizer로 나누거나 String.split()으로 문자열을 분리해서 처리해야한다.

String s = bf.readLine();
StringTokenizer st = new StringTokenizer(s);
int num1 = Integer.parseInt(st.nextToken());
int num2 = Integer.parseInt(st.nextToken());

2. BufferWriter

BufferWriterSystem.out과 유사하다.
마찬가지로 import를 통해 사용하며 BufferWriter.write()로 출력한다.
이 친구는 버퍼를 잡아놓기 때문에 BufferWriter.flush()를 통해 남은 데이터를 전부 출력시킨 뒤 close()로 닫는 뒷정리가 필요하다.

❗ 사실 Scanner도 close()로 닫는게 맞다. 습관이 안된 것일 뿐이지.

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write(num1 + num2 + "\n");
bw.flush();
bw.close();

⚡ 15552번 정답

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

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); 
		int n = Integer.parseInt(bf.readLine());
		
		for(int i = 0; i < n; i++) {
			String s = bf.readLine();
			StringTokenizer st = new StringTokenizer(s);
			int num1 = Integer.parseInt(st.nextToken());
			int num2 = Integer.parseInt(st.nextToken());
			
			bw.write(num1 + num2 + "\n");
		}
		
		bw.flush();
		bw.close();
	}

}

아무쪼록 새로운 입출력 방식에 익숙해져야 시간 제한의 덫을 벗어날 수 있을테니 익숙해질 필요가 있어보인다.

profile
Hodie mihi, Cras tibi

0개의 댓글