본문 바로가기

알고리즘/문제 풀이

백준 15552 문제(빠른 A+B) Code review

1. 문제 분석

문제의 요구 조건은 1.5초안에 최대 1,000,000개 이상의 더하기 연산을 하여 하나 하나 출력하는 것이다. 

여기서 중요한 것은 1.5초라는 시간이다. 

2. 기존에 입출력을 담당하던 scanner로 문제를 풀면 안되는 이유

scanner는 입력 받은 구문 분석을 위해 정규식을 남발한다. 실제로 Scanner 내부 코드를 뜯어보면, 입력 받은 구문을 분석하기 위해 많은 명령을 거친다는 것을 알 수 있다. 따라서 따로 입력 받은 값에 대한 구문분석이 없는 BufferedReader를 통해 해당 문제를 풀어야한다.

 

3. 해답코드

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));

        // 행 단위로 입력 받음, parseInt()는 ()안에 받은 값을 int로 바꿔주는 것. 
        // br.readLine은 행 단위로 구분하여 값을 받겠다는 것.
        int T = Integer.parseInt(br.readLine());


        // 이제부터 space bar 단위로 입력 값들을 구분하기 위해 StringTokenizer 이용
        StringTokenizer st;

        for (int i = 0; i < T; i++) {
            // br 개행 단위로 입력 받은 값을 " "를 기준으로 잘라서 입력 받겠다.
            st = new StringTokenizer(br.readLine(), " ");
            
            // st.nextToken()은 " "로 잘라서 입력 받은 하나의 값을 의미, 
            // nextToken()을 호출 할 때 마다 그 다음 값으로 offset이 옮겨간다. 
            // Integer.parseInt() == 괄호 안의 값을 int 자료형으로 바꾼다.
            bw.write((Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken())) + "\n");
        }
        br.close(); // -> 입력 스트림 닫기
        bw.flush(); // -> 버퍼 안에 있는 것 비우기
        bw.close(); // -> 출력 스트림 닫기
    }

}

 

 

 

 

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[백준 11022번]  (0) 2023.02.08
[백준 11021번]  (0) 2023.02.08
JAVA QUIZ 08  (0) 2023.02.02
[JAVA QUIZ] 햄버거 주문서 만들기  (0) 2023.01.29
Java_Quiz_06_개인정보 보호 매소드 만들기  (0) 2023.01.25