동아리 동기들과 스터디 그룹을 만들어 숙제 중 하나인 백준문제 풀이를 진행하던 도중 간단하게 생각했던 Stack 문제에서 시간초과가 발생했다.
옛날에도 비슷한 경험을 했던 적이 있어서 입력방법을 다르게 했더니 해결이 되었던 경험이 있었는데.. 싶어 찾아보니 Scanner 클래스보다 속도면에서 훨씬 우수한 BufferedReader 라는 것이 있다는 것을 알았다.
Scanner | BufferReader | |
패키지 | java.util | java.io |
데이터 전송 타이밍 | 입력 받음과 동시에 즉시 전송. | 개행문자 만날 때, Buffer 가득 찰 때 버퍼내용 한 번에 보냄. |
속도 | 비교적 느림. | 비교적 빠름. |
데이터 파싱 | 별도의 형변환이 필요 없다. | 모든 입력을 String으로 받으므로 별도의 형변환이 필요할 수 있다. |
버퍼 크기 | 1KB | 8KB |
I/OException | 직접 예외처리 할 필요가 없다. | try-catch 나 throw를 통해 직접 예외처리 해줘야 한다. |
thread safe | thread unsafe | thread safe |
BufferReader를 사용하기 위해 알아두어야 할 사항으로는 다음이 있었다.
1. BufferedReader 가 Scanner 보다 속도면에서 훨씬 우수하다.
2. BufferedReader 는 모든 입력을 String으로 받기 때문에 형 변환을 명시적으로 해주어야 한다.
3. BufferedReader를 사용하기 위해선 IOException을 따로 처리해주어야 한다.
4. Scanner와 같이 BufferedReader 객체를 생성한 후 입력을 받을 수 있다.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
5. 입력받는 방법은 다음과 같다.
String string = bufferedReader.readLine();
int i = Integer.parseInt(bufferedReader.readLine());
6. 만약 공백을 기준으로 입력을 나눠 받는다면 util 패키지의 StringTokenizer를 사용한다.
import java.util.*;
StringTokenizer stringTokenizer = new StringTokenizer(bufferReader.readLine());
String s1 = stringTokenizer.nextToken();
String s2 = stringTokenizer.nextToken();
String s3 = stringTokenizer.nextToken();
BufferedReader를 사용해 풀던 Stack 문제를 마저 구현하면 다음과 같다.
https://www.acmicpc.net/problem/10828
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int n;
static Stack<String> stack = new Stack<>();
static StringBuilder answer = new StringBuilder();
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(bufferedReader.readLine());
for(int i=0; i<n; i++) {
StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
switch (stringTokenizer.nextToken()) {
case "push" :
stack.push(stringTokenizer.nextToken());
break;
case "pop" :
if(stack.isEmpty()) {
answer.append("-1\n");
break;
}
else {
answer.append(stack.pop() + "\n");
break;
}
case "size" :
if(stack.isEmpty()) {
answer.append("0\n");
break;
}
else {
answer.append(stack.size() + "\n");
break;
}
case "empty" :
if(stack.isEmpty()) {
answer.append("1\n");
break;
}
else {
answer.append("0\n");
break;
}
case "top" :
if(stack.isEmpty()) {
answer.append("-1\n");
break;
}
else {
answer.append(stack.peek() + "\n");
break;
}
default:
break;
}
}
System.out.println(answer);
}
}
ref.
'[Java] > 문법, 자료구조, 알고리즘' 카테고리의 다른 글
Heap (0) | 2023.03.21 |
---|---|
Stack / Queue (0) | 2023.03.20 |
TreeSet, Red-Black Tree (0) | 2023.03.10 |
HashMap (0) | 2023.03.10 |
소수 (에라토스테네스의 체) (0) | 2023.03.10 |