ABOUT ME

작은 디테일에 집착하는 개발자

Today
-
Yesterday
-
Total
-
  • [백준 알고리즘/Java] 15552번 빠른 A+B
    IT Study/백준 알고리즘 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(); // 출력 스트림 닫기

     

Designed by Tistory.