문제
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
1) 문제 이해
: 자료구조의 Stack은 후입선출(LIFO, Last In First Out) 방식으로 동작하는 선형 자료 구조이다.
2) 문제 풀이 1
2-1) 코드
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
Stack<Integer> stack = new Stack<>();
for(int i = 0; i < n; i++) {
int command = input.nextInt();
switch(command) {
case 1:
stack.push(input.nextInt());
break;
case 2:
if(stack.size() > 0) {
System.out.println(stack.pop());
} else {
System.out.println(-1);
}
break;
case 3:
System.out.println(stack.size());
break;
case 4:
if(stack.isEmpty()) {
System.out.println(1);
} else {
System.out.println(0);
}
break;
case 5:
if(stack.isEmpty()) {
System.out.println(-1);
} else {
System.out.println(stack.peek());
}
}
}
}
}
2-2) 문제점
위의 코드로 정답을 제출한 결과, "시간 초과" 라는 결과가 나오게 되었다.
3) 문제 풀이 2
이렇게 코딩테스트를 풀다 보면, 시간 초과의 원인으로 자주 언급되는 내용은 Scanner
의 사용이였다.Scanner
로 값을 읽어들일 때 가장 큰 단점은 "속도"이기 때문에,BufferedReader
를 활용하여 다시 문제를 풀어보기로 했다.
3-1) 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
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());
Stack<Integer> stack = new Stack<>();
for(int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int command = Integer.parseInt(st.nextToken());
switch(command) {
case 1:
stack.push(Integer.parseInt(st.nextToken()));
break;
case 2:
if(stack.size() > 0) {
bw.write(stack.pop() + "\n");
} else {
bw.write(-1 + "\n");
}
break;
case 3:
bw.write(stack.size() + "\n");
break;
case 4:
if(stack.isEmpty()) {
bw.write(1 + "\n");
} else {
bw.write(0 + "\n");
}
break;
case 5:
if(stack.isEmpty()) {
bw.write(-1 + "\n");
} else {
bw.write(stack.peek() + "\n");
}
}
}
bw.flush();
bw.close();
br.close();
}
}
3-2) 결과
[reference]
https://velog.io/@alkwen0996/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%8A%A4%ED%83%9DStack