성장일기

내가 보려고 정리하는 공부기록

코딩테스트/백준 브론즈,실버

[백준] 15552 : 빠른 A+B (BufferReader, BufferWriter 사용하기) - JAVA

와나나나 2024. 1. 8. 23:32
728x90

백준 단계별 문제풀이 3단계 (반복문) 

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

 

# 문제

본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.
Java를 사용하고 있다면, `Scanner`와 `System.out.println` 대신 `BufferedReader`와 `BufferedWriter`를 사용할 수 있다. `BufferedWriter.flush`는 맨 마지막에 한 번만 하면 된다.
 

# 필요개념

보통 자바에서는 입력을 받는 Scanner와 출력을 하는 System.out.println를 사용하는데, 

이보다 더 빠르게 입출력 처리를 할 수 있도록 하는 것이 바로 Buffer이라고 한다.

 

Buffer를 사용하면 입력된 데이터가 바로 전달되지 않고 버퍼를 거쳐 전달되어 데이터 처리 효율성이 올라간다.

단, 값을 줄바꿈 단위로 받기 때문에, StringTokenizer를 사용해 가공작업을 거쳐줘야 한다. (공백 단위로 데이터를 받아야 하는 경우)

사용시에는 java.io를 import 해주는 걸 잊지 말자

 

BufferedReader 사용시 주의사항 !!

  1. readLine() 메소드 이용시 리턴값이 String으로 고정된다 -> 배열로 형변환이 필요할 수 있다
     - 그래서 해당 문제처럼 int로 가져오고 싶으면 형 변환을 해줘야 한다 (Integer.parseInt())
  2. 예외처리를 꼭 해야한다
     - readLine() 쓸 때마다 try&catch문을 사용해도 된다.
     - throws IOException을 사용하는게 편할 것이다.

 

# Code

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        int a = Integer.parseInt(br.readLine());

        for (int i = 0 ; i < a ; i++) {
            st = new StringTokenizer(br.readLine());
            bw.write((Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken())) + "\n");
        }
        bw.close(); // Writer 꼭 닫아주기!
    }
}

 

Buffer 종류는 

java.io.BufferedReader
java.io.BufferedWriter
java.io.InputStreamReader
java.io.OutputStreamWriter
가 있어서, java.io.*로 임포트 해주었다.
 

# 결과

 
문제 자체는 어려운 문제가 아니었지만, Buffer 사용법을 다시 한 번 공부할 수 있는 문제였다!