Algorithm/나머지 문제들

[Baekjoon/JAVA] 백준 15552번 빠른 A + B

양선규 2023. 6. 26. 21:15
728x90
반응형

문제
입/출력

 

이 문제는 단순히 A + B를 출력하면 되는 문제이지만, 시간 제한이 걸려 있어 Scanner를 사용하면 문제를 풀 수 없습니다.

따라서 비교적 처리속도가 빠른 BufferedReader, BufferedWriter를 이용해야 합니다.

 

 

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 n = Integer.parseInt(br.readLine());
        
        StringTokenizer st;
        
        for(int i=0; i<n; i++) {
            st = new StringTokenizer(br.readLine()," ");
            bw.write((Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken()))+ "\n");
        }
        br.close();
        
        bw.flush();
        bw.close();
    }
}

 

일단.. BufferedReader와 입출력 함수들을 이용하기 위해 java.io.* 패키지를 import 했습니다.

StringTokenizer 사용을 위해 java.util.StringTokenizer 패키지도 import 했습니다.

StringTokenizer는 BufferedReader를 통해 여러개의 입력을 받기 위해 필요합니다.

 

main함수 선언에서 throws IOException 부분은 적어놓지 않으면 BufferedReader를 사용할 수 없다는.. 정확히는 모르겠는데 어쨌든 사용해야 합니다. 예외처리 구문이라고 합니다.

 

int n = Integer.parseInt(br.readLine()) 부분은 br로 입력받은 값을 int형으로 변환시켜주는 부분입니다.

 

반복문에선 st(StringTokenizer)를 이용해 br.readline으로 입력받는 값을 " "(공백)을 기준으로 입력받고, 여기서 입력받은 값은 Token 이라고 합니다.

nextToken()은 다음 토큰을 의미합니다. 공백 기준으로 입력 받았으니, 10 20 을 입력했다면

첫번째 토큰은 10이 되고 두번째 토큰은 20이 되겠죠.

 

그리고 bw.write를 이용해 출력하게 되는데,

여기서도 Integer.parseInt를 이용해 int형으로 변환시켜 주고, 두 토큰의 값을 더해서 출력합니다. 그리고 마지막 \n 개행문자까지.

 

마지막으로 br과 bw는 닫아주어야 합니다. close는 닫기(종료), flush는 현재 남아있는 값을 출력하는 것(값을 지우는 것)입니다.

 

이렇게 작성하면 대략 800ms 정도가 걸리고 문제를 해결할 수 있습니다.

 

bw.write() 괄호 안에선 숫자 계산이 안되는 것처럼 보이는데, 사실 계산은 되고 있지만 출력에서 문제가 있는 것입니다.

문자열로 변환만 해주면 되는데요.

 

a = 1, b = 2 라고 했을 때,

bw.write(a+b); 를 하면 출력이 비정상적이지만

bw.write(Integer.toString(a+b)); 이렇게 문자열로 변환해주거나

bw.write((a+b) + " "); 이렇게 공백만 하나 넣어줘도 문자열로 변환되어 정상적인 계산값이 출력됩니다.

 

음.. 그리고 bw.write는 System.out.println과 함께 사용할 시, 위에 작성하더라도 항상 println함수보다 출력이 늦더라고요.

bw.write는 바로 출력을 하는게 아닌, bw.close() 또는 bw.flush()가 일어날 때 출력을 한다고 합니다.

그래서 만약 println함수처럼 바로 출력하고 싶다면 바로 아래에 bw.close() 또는 bw.flush()를 작성하면 됩니다.

물론 bw.close() 를 쓰면 버퍼가 닫히니, flush를 사용하면 되겠네요.

 

==============

 

파이썬으로 작성할 때는 간단한 코드 3줄,4줄 만에 해결할 수 있었는데 자바는 이렇게 길다니..

별거 아닌 문제에 공부할 것도 많고 작성할 코드가 너무 길어서 현타가 오긴 하네요.

728x90
반응형