[백준Java] 15552번 _ 빠른 A+B

박주현·2023년 7월 27일
0

Baekjoon

목록 보기
8/24
post-thumbnail

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

1. 문제

본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.

C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL)과 sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.

Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.

Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.

또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.

자세한 설명 및 다른 언어의 경우는 이 글에 설명되어 있다.

이 블로그 글에서 BOJ의 기타 여러 가지 팁을 볼 수 있다.

2. 입력

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

3. 출력

각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.

4. 코드

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

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

        for(int i=0; i<TC; i++) {
            st = new StringTokenizer(br.readLine());
            int A = Integer.parseInt(st.nextToken());
            int B = Integer.parseInt(st.nextToken());
            int sum = A+B;

            bw.write(sum + "\n");
        }
        bw.flush();
    }
}

5. 회고

BufferReader와 BufferWriter에 대해 기본이 부족해서 문제를 통과하지 못하였다.
빠르게 학습하여 문제를 복습하고 다른 문제에도 적용시켜 나가야겠다.

6. 학습한 내용

BufferReader 와 BufferWriter은 빠른 입력과 출력을 의미한다.
두 가지는 Scanner와 sout인 System.out.println을 대체하여 사용하는데 시간초과의 문제점이 생기지 않아서 사용한다.

차이점으로는 흐름도에서 볼 수 있다.
Scanner와 System.out.print를 사용할 경우 프로그램과 유저가 다이렉트로 과정이 진행되지만
BufferReader와 BufferWriter 같은 경우에는 프로그램과 유저 사이에 배치되어 과정이 추가되었다고 볼 수 있다.

그렇다면 왜? 과정이 추가되었는데 더 빠를까?
바로 오버헤드가 적게 발생한다는 점이다. 사용자가 입력하기위해 키보드를 사용할때마다 프로그램에게 전달된다면
한글자 한글자에 대한 전달로 인한 오버헤드가 발생한다. 하지만, BufferReader 와 BufferWriter 같은 경우에는 한번에 전달된다는 특징이 있기에 속도가 빠르다.

하지만, 장점만 있는 것은 아니다.
단점 으로는 IOException의 예외처리가 필수이며 입력데이터가 모두 String 타입으로 반환된다는 점이다.
또한, split() 함수를 사용해야되고 숫자형식을 받고 싶을 경우에는 형변환을 해야하는 번거로움이 있다.

profile
빌드업 막 시작하는 개발자

0개의 댓글

관련 채용 정보