IT Study/백준 알고리즘

[백준 알고리즘/Java] 15552번 빠른 A+B

three kim 2023. 3. 13. 17:54
728x90

사용자에게 입력받는 함수로는 Scanner만 알고 있었기 때문에

처음엔 1000번 'A+B'와 동일하게 작성하게 제출했습니다.

 

<시간 초과>

import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int t = sc.nextInt();
		
		for(int n = 0; n < t; n++) {
			int a = sc.nextInt();
			int b = sc.nextInt();
			System.out.println(a+b);
		}
	}
}

Scanner와 System.out.println()을 사용하면 시간 초과로 15552번 문제를 넘어갈 수 없습니다.

이를 해결하기 위해서는 BufferedReader와 BufferedWriter의 개념을 이해해야합니다.

 

1. 최종 결과만 보고싶으시다면 아래의 <최종 제출본>을 봐주세요!

2. BufferedReader와 BufferedWriter의 개념에 대해 이해하고 싶으시다면 아래의 링크를 타고 들어가주세요!

 

[Java] BufferedReader와 BufferedWriter (입출력 속도)

백준 알고리즘을 풀며 Scanner와 System.out.println() 사용할 때, 📌 시간 초과가 나는 이유는 무엇일까요? - Java 입력 속도 6위에 자리매김한 BufferedReader와 Integer.parseInt와 비교하여 Scanner를 사용할 때에

1-three.tistory.com

 

<최종 제출본>

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 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 n = Integer.parseInt(br.readLine());
		
		StringTokenizer st;
		
		for(int i = 0; i<n; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			bw.write(Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken()) + "\n");
		}
		br.close();
		
		bw.flush();
		bw.close();
	}
}

 

<과정>

① import문 선언 및 예외처리

import문 : 자바 컴파일러에 코드에서 사용할 클래스의 패키지에 대한 정보를 미리 제공하기 위해 선언

import java.io.BufferedReader;		// BufferedReader
import java.io.BufferedWriter;		// BufferedWriter
import java.io.IOException;		// throws IOException
import java.io.InputStreamReader;	// InputStreamReader
import java.io.OutputStreamWriter;	// OutputStreamWriter
import java.util.StringTokenizer;	// StringTokenizer

 

public static void main(String[] args) throws IOException {

// BufferedReader, BufferedWriter를 위해 예외 처리

 

입력을 위해 BufferedReader, 출력을 위해 BufferedWriter를 선언

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

 

테스트케이스의 개수를 입력받기 위한 변수 n을 선언

int n = Integer.parseInt(br.readLine());

// br.readLine()	: String 타입으로 입력
// Integer.parseInt()	: int 타입으로 변경

 

문자열을 (사용자가 지정한) 구분자로 분리하기 위한 Token을 선언

StringTokenizer st;

 

두 정수 A, B를 n번 입력받기 위해 for문을 사용

for(int i = 0; i<n; i++) {
	st = new StringTokenizer(br.readLine(), " ");
	bw.write(Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken()) + "\n");
}
st = new StringTokenizer(br.readLine(), " ");

// StringTokenizer(String str,String delim)
// 주어진 문자열 str을 구분자 delim으로 분리한 Token(분리된 문자열)
bw.write(Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken()) + "\n");

// write() : 출력할 내용 담기 (아직 출력되지 않음)
// nextToken() : Token(분리된 문자열) 반환

 

⑥ 입력 스트림 닫기

br.close();

 

⑦ 버퍼 비우기와 동시에 출력, 출력 스트림 닫기

bw.flush(); // 버퍼 비우기와 동시에 출력
bw.close(); // 출력 스트림 닫기