🟤 백준 15552번: 빠른 A+B (브론즈4)
문제 풀이
1차 풀이
🕐 시간 초과
import java.util.*;
import java.lang.*;
import java.io.*;
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());
// t번 반복
for (int i=0; i<t; i++) {
StringTokenizer st = new StringTokenizer(br.readLine()); // 문자열 분리
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
// buffer에 저장
bw.write((a + b) + "\n"); // \n: 개행
bw.flush(); // 버퍼에 있는 모든 데이터 출력
}
// 스트림 닫음
bw.close();
}
}
- BufferedReader, BufferedWriter를 사용해서 입출력 시간 최적화
- StringTokenizer를 통해 빠른 문자열 분리
위 두 과정을 진행했지만 시간 초과 나옴
2차 풀이
🕐 시간 초과
import java.util.*;
import java.lang.*;
import java.io.*;
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());
// t번 반복
for (int i=0; i<t; i++) {
String[] ab = br.readLine().split(" ", 2); // 문자열 분리
int a = Integer.parseInt(ab[0]);
int b = Integer.parseInt(ab[1]);
// buffer에 저장
bw.write((a + b) + "\n"); // \n: 개행
bw.flush(); // 버퍼에 있는 모든 데이터 출력
}
// 스트림 닫음
bw.close();
}
}
혹시나 해서 `split()`으로 문자열 분리를 해봤지만 시간 초과
3차 풀이
import java.util.*;
import java.lang.*;
import java.io.*;
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());
// t번 반복
for (int i=0; i<t; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
// buffer에 저장
bw.write((a + b) + "\n"); // \n: 개행
}
bw.flush(); // 버퍼에 있는 모든 데이터 출력
// 스트림 닫음
bw.close();
}
}
`flush()` 위치 변경
이전 코드는 반복문 안에서 매번 flush 하는데, 불필요한 IO 매번 발생시켜서 속도 저하
→ `flush()`는 모든 출력을 한 번에 하고 싶을 때 쓰는 게 효율적
반복문 밖에서 1번만 호출하도록 수정하니까 시간 초과 해결
4차 풀이
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));
StringBuilder sb = new StringBuilder(); // 출력 문자열을 저장할 버퍼
int t = Integer.parseInt(br.readLine());
for (int i = 0; i < t; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
sb.append(a + b).append('\n'); // 개행도 미리 추가
}
System.out.print(sb); // 한 번에 출력
}
}
StringBuilder로 문자열을 한꺼번에 모아서 출력
- ① `flush()`와 `write()`를 최소화, ② 문자열 연산 줄임 → 성능 최적화
- `System.out.print()`로 한 번에 출력
'Coding Test > PS' 카테고리의 다른 글
[백준/Java] 2480번: 주사위 세개 (브론즈4) (0) | 2025.03.30 |
---|---|
[백준/Java] 25304번: 영수증 (브론즈4) (0) | 2025.03.30 |
[백준/Java] 3052번: 나머지 (브론즈2) (0) | 2025.03.25 |
[백준/Java] 2739번: 구구단 (브론즈5) (0) | 2025.03.25 |
[백준/Java] 1008번: A/B (브론즈5) (0) | 2025.03.24 |