알고리즘/백준(BAEKJOON)

15552/빠른 A+B/자바/for문

jojelly 2020. 7. 30. 15:02
반응형

 

이 문제는 저번글에서 다룬 A+B를 더 빠른 결과를 출력할 수 있는 방법을 알아보는 문제이다. 

 

2020/07/28 - [백준(BAEKJOON)] - 10950/백준/A+B - 3/자바/java

 

10950/백준/A+B - 3/자바/java

간단한 for문 문제이다 A값과B의값을 scanner를 사용하여 입력받은 후 A와 B를 더해주는 식을 사용하면된다. 단! 첫째줄에 입력되는 테스트갯수 T만큼만 반복하여야 한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

jojelly.tistory.com

기존 방법을 scanner를 사용했다면 이번에는 buffereader와 bufferwtiter를 사용하여 입력값과 출력값을 나타낸다. 

buffer를 사용하는 이유는 테스트 케이스가 만약에 작을땐 Scanner를 사용해도 시간상 문제가 없겠지만 1,000개 10,000개가 넘어간다면 Scanner을 10,000번 불러야 하는데 성능상 문제가 생긴다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
 
public class Main4_4 {
 
    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());
        int a,b =0;
        
        for (int i = 0; i < T; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            a = Integer.parseInt(st.nextToken());
            b =  Integer.parseInt(st.nextToken());
            
            bw.write((a+b)+ "\n");
        }
        bw.flush();
        bw.close();
        br.close();        
    }
}
 
cs

 

 

우선, 보조스트림은 IOException이 생기게 한다.

나는 그 예외를 미룰것이기 때문에 throws IOException을 메인 옆에다 추가

먼저 버퍼를 읽어줄 객체 (BufferedReader bufr) 생성해주고, 

버퍼에 쓸 객체(BufferedWriter bufw)을 생성해 준다. 이는 키보드로 입력한 데이터를 readLine() 이라는 메소드로 버퍼안에 있는 데이터를 '문자열'로서 받아들여준다.(보조스트림은 입출력시 데이터를 '문자열'로 취급)

 

 

13줄을 보면 버퍼 안에 있는 데이터를 '문자열'로 받아들인 후 int형으로 파싱했다. 이를 T라는 변수에 저장시켜준다.

T 는 우리가 계산할 테스트 개수이다.  

 

 

 

 StringTokenizer : 문자열을 토큰화 시켜주는 클래스다.( 보통 공백을 기준으로 토큰화)

(ex : 오늘 공부 힘들다 -> 오늘/공부/힘들다)

(두번째 파라미터의 디폴트 값이 공백이다.)

 

문제에서 테스트 입력을 보면

 

5
1 1
12 34
5 500
40 60
1000 1000

 

이런식인데, readLine()메소드는 '공백'마저도 받아들이는 '문자열'로 데이터를 처리하기 때문에 StringTokenizer를 사용한다. nextToken() 메소드는 다음 기준까지의 토큰을 반환해준다. 만약4 5 라고 입력한다면 a = 4, b = 5 로 대입된다는 뜻이다. 

 

 

이후 for문에 의해 차례대로 (a+b)를 출력만 하면 된다. 

이떄 , 기존에 사용하던 System.out.println()메소드가 아닌  BufferedWriter write()메소드를 사용한다. 

 

 

사용법은 wirte()메소드의 파라미터에 출력하고픈 데이터를 String형으로 넣어주는데, 개행문자는 \n 혹은 newLine() 메소드를 이용해야한다. 

 

마지막으로  write()메소드를 통해서 버퍼에 채운 데이터를 flush()메소드 사용하여 비워준다. 

반응형