https://www.acmicpc.net/problem/15552
15552번: 빠른 A+B
첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.
www.acmicpc.net
문제
입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다
JAVA - Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter 를 사용 할 수 있다.
BufferedWriter.flush 는 맨 마지막에 한번만 하면 된다.
System.out.println() 을 안쓰는 이유
시간 제한이 있기 때문에. 테스트케이스의 개수 T = 1,000,000개가 주어진다.
케이스가 늘어날 수록 System.out.println()의 호출 횟수또한 증가한다.
그렇기에 각 테스트 케이스마다 호출을 하면 시간초과를 하기에 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 T = Integer.parseInt(br.readLine());
StringTokenizer st;
for(int i=0; i<T; i++){
st = new StringTokenizer(br.readLine()," ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
bw.write((N + M) + "\n");
}
br.close();
bw.flush(); // 남아있는 데이터 모두 출력
bw.close();
}
}
입력 = BufferedReader.readLine()
입력은 readLine(); 메서드를 사용하는데, String으로 리턴 값이 고정 되어 있기 때문에 다른 타입으로 입력을
받고자 한다면 반드시 형변환이 필요하다.
Integer.parseInt();
StringTokenizer은 BufferedReader를 통해 읽어온 데이터는 Line 단위로 나누어 진다. 이를 공백 단위로
데이터를 가공하고자 하면 따로 작업을 해주어야 한다.
st = new StringTokenizer(br.readLine(), " ");
StringTokenizer의 nextToken() 함수를 쓰면 readLine()을 통해 입력 받은 값을 공백 단위로 구분하여 순서대로 호출할 수 있다.
readLine() 시마다 예외처리가 반드시 필요하다.
try/catch문으로 감싸주어도 되고, public static void main(String args[]) 옆에 throws IOEcxeption을 통해 예외처리를
해도 된다.
BufferedReader 의 경우 close() 메소드를 명시해주지 않아도 Garbage Collector에 의해 BufferedReader 및 내부의 객체들이 자동으로 정리됩니다. 즉 BufferedReader의 경우, close()를 콜해주지 않아도 문제는 없습니다. Garbage Collector에 의하여 사용되지않는 자원이 정리되기 전에 연속/반복적으로 BufferedReader가 close 되지않고 사용되면 정상적으로 reading이 되지지 않습니다.
출력 = BufferedWriter
BufferedWriter의 경우 writing을 끝낸 후 적절하게 close()를 해주지 않는다면 정상적으로 writing이 되지 않는 경우가 많습니다. close()를 해주어야 한다고 명시한 이유는, 자원 관리의 중요성 때문입니다. 자바에서는 자원관리를 쉽게 해주는 Garbage Collector가 있기 때문에 큰문제가 되지 않을 수 있습니다. Native언어의 경우 자원관리를 프로그래머가 직접 해야하는 경우가 많기 때문에, 자원관리를 해주는 습관을 들이는 것이 좋습니다.
'Progamming > BAEK JOON > 백준의 알고리즘' 카테고리의 다른 글
[백준] 25314번 : 코딩은 체육과목 입니다 - JAVA ,BufferedReader, StringBuilder 사용 (0) | 2023.02.28 |
---|---|
[백준] 11022번 : A+B - 8 - JAVA, BufferedReader, BufferedWriter (0) | 2023.02.28 |
[백준] 8393번 : 합 - JAVA (0) | 2023.02.09 |
[백준] 10950번 : A+B -3 - JAVA (0) | 2023.02.08 |
[백준] 2739 : 구구단 - JAVA (0) | 2023.02.08 |