Rev Notebook

[B4] 백준 15552 빠른 A+B - Java

by Rev_

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

 

[풀이]

import java.io.*;
import java.util.StringTokenizer;
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));

        int t = Integer.parseInt(br.readLine());
        StringTokenizer st;

        for (int i = 0; i < t; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            bw.write((Integer.parseInt(st.nextToken())) + (Integer.parseInt(st.nextToken())) + "\n");
        }
        br.close();
        bw.flush();
        bw.close();
    }
}

시간 제한이 있기 때문에 빠른 입출력을 위해 BufferedReader, BufferedWriter 객체를 사용했다.

또한 한 줄에 공백을 기준으로 여러 값을 입력 받기 위하여 StringTokenizer를 사용해주었다.

 

BufferedReader

java에서 해당 문제는 Scanner로 풀 수 없다. Scanner는 입력을 받으면 구문 분석을 위해 정규식을 거치게 되는데, BufferedReader는 그런 특별한 구문 분석이 없어서 속도가 더 빠르다.

하지만 Scanner와 달리 BufferedReader는 개행 문자만 경계로 인식하고 입력받은 데이터가 String으로 고정된다. 그렇기 때문에 따로 데이터를 가공해야 하는 경우가 많다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();

int 데이터가 필요하다면 Integer.parseInt()를 사용해주도록 하자.

 

BufferedWriter

일반적으로 출력을 할 때, sysout을 사용한다. 적은 양의 출력에서는 편리하고, 그렇게 큰 성능 차이 없이 사용할 수 있다. 하지만 데이터의 양이 많을 경우에는 입력과 동일한 버퍼를 사용하는 것이 좋다.

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String str = "hi-rev";
bw.write(str);
bw.flush();
bw.close();

이 문제에서 모든 테스트 케이스가 1500ms 시간 안에 풀려야 한다. System.out.println()을 사용하게 되면, 문제에서는 최대 100만개의 테스트 케이스가 주어지는데, 케이스가 늘어날 수록 sysout의 호출 횟수 또한 증가한다.

따라서 BufferedReader를 사용했다 하더라도 sysout을 각 테스트 케이스 마다 해주면 시간 초과가 발생해버린다.

마지막으로 flush()를 사용하여 버퍼를 비운 후 close()로 닫아주도록 하자

 

StringTokenizer

앞서 말했듯이 BufferedReader는 개행 문자를 기준으로 입력 받는다. 따라서 공백을 기준으로 입력 받으려면 추가적인 가공을 해주어야 한다. 그 때 사용하는 것이 StringTokenizer이다.

이는 지정한 구분자로 문자열을 쪼개주는 역할을 한다. 그렇게 쪼개진 문자는 하나의 토큰으로 나눠진다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
System.out.println(a + " " + b);

이를 사용하면 한 줄에 공백을 구분으로 입력하면 각각 a와 b에 할당된다.

 

[Reference]

https://st-lab.tistory.com/30

https://rlakuku-program.tistory.com/33

'PS > PS' 카테고리의 다른 글

[S1] 백준 1149 RGB거리 - Java  (0) 2022.09.19
[B4] 백준 11720 숫자의 합 - Java  (0) 2022.08.11
[S5] 백준 4673 셀프 넘버 - Java  (0) 2022.08.09
[B2] 백준 2577 숫자의 개수 - Java  (0) 2022.08.05
[B3] 백준 2588 곱셈 - Java  (0) 2022.07.31

블로그의 정보

Hi Rev

Rev_

활동하기