관리 메뉴

LC Studio

백준 15552번 빠른 A+B (JAVA) 본문

Java/백준 알고리즘

백준 15552번 빠른 A+B (JAVA)

Leopard Cat 2022. 3. 10. 14:57

Scanner을 사용하여 입력받는 것이 아닌, 더 빠른 방식으로 입력받으라는 문제였다.

 

(Java를 사용하고 있다면, Scanner System.out.println 대신 BufferedReader BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.) 라고 나와있었다.

 

BufferedReader과 BufferedWriter에 대해 잘 몰라 공부하며 해결해 보았다.

package test;
import java.io.*;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main{
    public static void main(String[] args) throws IOException {
    	
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		//라인단위로 입력받는 BufferReader 객체 생성 
		
		int N = Integer.parseInt(reader.readLine());
		
		StringTokenizer st = null; //라인 입력시 공란을 파싱하기 위한 StringTokenizer 선언
		
		int[] array = new int[N];
		int[] sum = new int[N];
		
		for(int i=0;i<N;i++) {
			st = new StringTokenizer(reader.readLine());
			
			for(int j=0;j<2;j++) {
				array[j] = Integer.parseInt(st.nextToken());
			}
			
			int A = array[0];
			int B = array[1];
			sum[i] = A + B;
			
		}
		for(int k=0;k<N;k++) {
			System.out.println(sum[k]);
		}
    }
}

첫번째 시도, 시간초과

eclipse에서는 잘 작동하였다. BufferedReader을 활용하여 작성하기도 했다.

아마, System.out.pritln?을 처리하는데 시간이 많이 걸린 것 같다.

 

BufferedWriter을 활용해 보았다.

package test;
import java.io.*;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main{
    public static void main(String[] args) throws IOException {
    	
		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
		//라인단위로 입력받는 BufferReader 객체 생성 
		
		int N = Integer.parseInt(bufferedReader.readLine());
		//입력받을 줄의 개수 입력받기
		
		StringTokenizer st = null;
		//라인 입력시 공란을 파싱하기 위한 StringTokenizer 선언
		
		int[] array = new int[N];
		//StringTokenizer을 활용해 파싱된 Token을 저장하기 위한 배열
		int[] sum = new int[N];
		//파싱된 Token끼리의 합의 저장하기 위한 배열
		
		for(int i=0;i<N;i++) {
			st = new StringTokenizer(bufferedReader.readLine());
			//i<N일 동안 입력받아라
			for(int j=0;j<2;j++) {
				array[j] = Integer.parseInt(st.nextToken());
				//Token 저장하여라
			}
			
			int A = array[0];
			int B = array[1];
			sum[i] = A + B;
			//Token끼리 더하여라
			
		}
		bufferedReader.close();
		//reader 스트림 종료
		
		BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
		for(int k=0;k<N;k++) {
			bufferedWriter.write(sum[k]+"\n");
			// bufferedWriter 는 System.out.println 처럼 자동 개행 처리가 되지 않기 때문에 개행 처리를 따로 해줘야한다.
	        // bufferedWriter.newLine(); 을 활용하면 개행처리가 가능하나 이건 "\n"에 비해 속도가 느리다고 하니
	        // "\n" 을 활용해 개행처리를 하는 걸 권장한다. 또한 여기엔 하나의 장점이 더 있는데
	        // bufferedWriter.write(i); 처럼 writer에 int를 넣으면 아스키 코드에 따른 char형 값이 출력된다.
	        // 그러나 i와 개행 처리 문자열 "\n" 을 더하면 String 으로 자동 형변환 되기 때문에 
	        // 저장되어 있는 int 값 그대로 출력이 가능하다. 여러모로 이 편이 좋다는 얘기
			//주석 출처(https://takeknowledge.tistory.com/44)
		}
		bufferedWriter.flush(); // 다 사용했으면 남아있는 데이터를 모두 출력시키고
		bufferedWriter.close(); // writer스트림 종료
    }
}

 844ms로 성공했다!ㅎㅎ

 

반응형

'Java > 백준 알고리즘' 카테고리의 다른 글

백준 4344 평균은 넘겠지 (Java)  (0) 2022.03.15
백준 8958번 (JAVA)  (0) 2022.03.14
백준 3052 나머지(JAVA)  (0) 2022.03.11
백준 2577번 숫자의 개수  (0) 2022.03.11
백준 1110번 더하기 사이클 (JAVA)  (0) 2022.03.10