문제풀이에서 BufferedReader 와 BufferedWriter 의 중요성

서형준·2021년 5월 6일
0
post-thumbnail

이번에 백준 2493번 백준 문제를 풀면서, 평소에 Scanner와 System.out.println이 간단하여 편해서 주로 사용했는데 문제의 난이도와 요구사항이 많아질수록 쓰면 안되는 것을 깨닳았습니다. Scanner와 System.out.println이 시간초과 현상만 겪었는데 이번에 2493번 탑문제를 풀면서 메모리 초과를 겪으면서 BuffedReader와 BufferedWriter의 중요성을 느꼈습니다.
링크텍스트

처음에 위에 문제를 아래 소스코드로 풀었는데

import java.util.Scanner;
import java.util.Stack;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		
		Stack<topInfo> st=new Stack<>(); 
		for(int i=0; i<n; i++) {
			long v=sc.nextLong();
			while(!st.isEmpty()) {
				if(st.peek().height>=v) {
					System.out.print(st.peek().index+1+" ");
					break;
				}
				st.pop();
			} if(st.isEmpty()){
                System.out.print("0 ");
            }
			st.add(new topInfo(v,i));
		}
	}

}

class topInfo{
	long height;
	int index;
	topInfo(long height, int index){
		this.height=height;
		this.index=index;
	}
}

이것을 그대로 제출하게 되면 메모리 초과가 결과창에서 나타납니다.
시간초과가 아닌 메모리초과가 나타나서 로직이 잘못된줄알고 여러가지 고치고도 해결이 안되서 찾아봤는데 로직에 문제는 전혀 없고 BufferedReader와 BufferedWriter를 제외하고는 다른게 없었습니다.
그래서 위 문법을 사용해서 다시 풀어봤습니다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int n=Integer.parseInt(br.readLine());
		
		Stack<topInfo> stack=new Stack<>(); 
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(int i=0; i<n; i++) {
			long v=Long.parseLong(st.nextToken());
			while(!stack.isEmpty()) {
				if(stack.peek().height>=v) {
					bw.write(stack.peek().index+1 + " ");
					break;
				}
				stack.pop();
			} if(stack.isEmpty()){
				 bw.write("0 ");
            }
			stack.add(new topInfo(v,i));
		}
		bw.flush();
        br.close();
        bw.close();
	}

}
class topInfo{
	long height;
	int index;
	topInfo(long height, int index){
		this.height=height;
		this.index=index;
	}
}

바로 통과해서 얼마나 차이가 있는지 찾아봤습니다.
언어 입력방법 평균(초)
Java Scanner 4.8448
Java BufferedReader 0.6585
백준의 입력 속도 비교에서 보면 Scanner와 BufferedReader와 8배정도 차이가 나는걸보고 Scanner를 다시는 안쓰겠다고 다짐하였습니다....

다음에는 Scanner에 익숙하지만 BufferedReader와 BufferedWriter의 사용법을 익혀보겠습니다.

profile
실력있는 Back-End 개발자를 꿈꾸는 서형준입니다.

0개의 댓글