Algorithm & Data Structure/문제 풀이
[JAVA] baekjoon 15552
뭉지(moonz)
2021. 9. 11. 18:01
반응형
브론즈 2 문제. 빠른 A+B 15552번: 빠른 A+B (acmicpc.net)
문제를 풀기 전, 필요한 개념을 공부해야한다.
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가 더 빠르다고 한다.
반응형