뭉지(moonz) 2021. 9. 11. 18:01
반응형

브론즈 2 문제. 빠른 A+B 15552번: 빠른 A+B (acmicpc.net)

 

15552번: 빠른 A+B

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

www.acmicpc.net

 

 

문제를 풀기 전, 필요한 개념을 공부해야한다.

[Java 자바 입출력] BufferedReader/BufferedWriter (tistory.com)

 

Buffer

  • 데이터를 한곳에서 다른 곳으로 전송하는 동안 일시적으로 데이터를 보관하는 임시 메모리 영역
  • 버퍼를 이용해서 읽고 쓰면 속도 향상에 효율적
  • 메모리 버퍼에 데이터를 한데 묶어서 이동시키는 것!

Buffer Flush (버퍼 플러시)

  • 버퍼에 남아있는 데이터를 출력 (버퍼를 비우는 동작)

BufferedReader : 버퍼를 이용한 입력

  • 엔터만 경계로 인식하고 데이터를 String으로만 인식하기 때문에 따로 가공 필요
  • 많은 데이터를 입력받아야 할 상황에서 이용하면 좋음
  • BufferedReader는 IOException처리가 무조건 필요!
  • 사용방법
    • readLine()을 사용하면 데이터를 라인 단위로 읽음
    • 리턴값이 String으로 고정되므로 다른 타입일 시, 형변환을 해줘야 함
    • 공백 단위로 데이터를 구분하려면?
      • StringTokenizer의 nextToken 함수 OR String 클래스의 split 함수 이용!
더보기

StringTokenizer

- 사용자가 지정하는 구분자를 경계로 하여 문자열을 나눠주는 Class

- 생략 시, default는 공백 이나

- 3번째 인수로 구분자를 토큰에 포함할지의 여부 지정 가능

import java.io.*;
//import java.io.BufferedReader;
//import java.io.IOException;
//import java.io.InputStreamReader;

import java.util.*;
//import java.util.StringTokenizer;

class test{
  public static void main(String[] args) throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
    // readLine()을 이용해 한 줄을 한번에 입력받음
    //스트링 토크나이저를 이용해 한 줄을 한번에 입력받은것을 띄어쓰기(" ")를 기준으로 쪼갬
    StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    System.out.println(st); //java.util.StringTokenizer@70a9f84e
    
    //쪼갠 값이 존재할때까지 반복
    while(st.hasMoreTokens()){
      //nextToken()을 통해 띄어쓰기(" ")를 제거하고 남은 숫자를 String에서 int로 형변환하여 출력
      System.out.println(Integer.parseInt(st.nextToken()));
    }    
  }
}

 

 

BufferedWriter : 버퍼를 이용한 출력

  • System.out.println(""); 과 동일한 함수
  • 많은 양의 출력이 필요할 때 이용하면 좋음
  • But, 자동 개행이 되지 않기 때문에
    • "\n" OR newLine() 이용!

 

문제

 

 

전체 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.StringTokenizer;

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

 

 

BufferedWriter 대신 StringBuilder 를 이용해서 코드를 작성해보겠다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.StringTokenizer;

class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

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

        StringTokenizer st;
        for (int i=0; i<T; i++) {
            st = new StringTokenizer(br.readLine(), " ");
          // 버퍼로 전송
            sb.append(Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken())).append("\n");
        }    
        br.close(); //입력이 끝났으니 닫기
        System.out.println(sb);
    }
}

 

 

StringBuilder가 조금 더 빠른 속도를 보이는 것을 알 수 있다.

But, 데이터 수가 매우 많을 경우, BufferedWriter가 더 빠르다고 한다.

반응형