ToBe끝판왕

[ 알고리즘 ] 백준 15552번 문제 - 자바( JAVA ) 본문

■ 알고리즘/백준 JAVA

[ 알고리즘 ] 백준 15552번 문제 - 자바( JAVA )

업그레이드중 2022. 5. 25. 11:54
반응형

주의사항

※ 백준에서 정해진 출력 형식을 출력해야 한다.
※ 백준 알고리즘에서는 클래스명을 Main으로 해주어야 한다.

 


 

백준 15552번 문제

 

백준 알고리즘의 단계별 문제 풀기

3단계 < 반복문 >

 

 

 해당 문제 링

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

 


 

코딩 하기

 

1) BufferedWriter 사용

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

 

 

2) StringBuilder 사용

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main {
 
	public static void main( String[] args ) throws IOException {
 
		BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) );
 
		int T = Integer.parseInt( br.readLine() );
        
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();
        
		for ( int i=0; i<T; i++ ) {
			st = new StringTokenizer( br.readLine() , " " );
			sb.append( Integer.parseInt( st.nextToken() ) + Integer.parseInt( st.nextToken() ) ).append( '\n' );
		}
		br.close();
 
		System.out.println( sb );
	}
}

 

 

 

문제 해결

 

문제를 보면 최대 100만개의 테스트 케이스가 주어진다.

케이스가 늘어나면 System.out.println( ) 의 호출횟수 또한 증가한다. 그래서 아무리 BufferedReader를 쓰더라도 System.out.println( ) 을 각 테스트 케이스마다 사용하면 시간이 초과되게 된다. 

 

※  주의사항

•  시간제한은 1.5초 ( 1500ms 이하여야 한다. )

•  Scanner 대신 BufferedReader 클래스를 사용한다.

 

 

 

1) BufferedWriter 사용

 

System.out.println( ) 을 사용하면 시간이 초과되기 때문에, BufferedWriter를 사용하여 버퍼에 담아둔 후

한번에 출력을 하게 만든다. ( 많은 양의 출력이 필요하게 되는 경우 성능면에서 더 뛰어나다. )

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

 

 

•  테스트 케이스에서 주어지는 두 정수는 문자열 분리를 위해 매 반복마다 StringTokenizer을 생성과 동시에 문자를 입력받고

   반환되는 String 타입을 Integer.parseInt를 통해 int형으로 형변환 해준다.

•  write( ) 메서드를 사용하여 두 토큰을 더해준 출력할 내용을 담고 flush( ) 메서드로 버퍼를 비워내는 동시에 출력을 한다.

   ( 반드시 flush( ) 메서드를 써주어야 한다. ) 후처리를 위해 close( ) 메서드를 통해 스트림을 닫는다.

•  System.out.println( ) 메서드와 달리 자동개행 기능이 없기 때문에 "\n"을 통해 처리해준다.

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

 

 

 

2) StringBuilder 사용

 

•  StringBuilder 클래스로 하나의 문자열로 계속 연결시킨 후, 가장 마지막에 연결된 문자열을 출력한다.

•  append( ) 메서드를 사용해 문자열을 쉽게 추가할 수 있다.

StringTokenizer st;
		StringBuilder sb = new StringBuilder();
        
		for ( int i=0; i<T; i++ ) {
			st = new StringTokenizer( br.readLine() , " " );
			sb.append( Integer.parseInt( st.nextToken() ) + Integer.parseInt( st.nextToken() ) ).append( '\n' );
		}
		br.close();
 
		System.out.println( sb );
	}

 

 

 

 

반응형
Comments