본문 바로가기

Coding Test/PS

[백준/Java] 15552번: 빠른 A+B (브론즈4)

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

 

  1. BufferedReader, BufferedWriter를 사용해서 입출력 시간 최적화
  2. 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()`로 한 번에 출력