티스토리 뷰
728x90
문제
- 정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램 작성
- push X : 정수 X를 스택에 넣기
- pop : 스택에서 가장 위에 있는 정수를 빼고, 그 수 출력. 만약 스택에 들어있는 정수가 없는 경우 -1 출력
- size : 스택에 들어있는 정수의 개수 출력
- empty : 스택이 비어있으면 1, 아니면 0 출력
- top : 스택의 가장 위에 있는 정수 출력. 만약 스택에 들어있는 정수가 없는 경우 -1 출력
해결방법
이번에 이 문제를 해결할 때에는 자바 내의 stack 클래스를 이용하여 문제를 해결하였다. push X (push(x)), pop (pop()), size(size()), empty(isEmpty()), top(peek()) 메소드를 이용하여 문제를 해결하였다.
지난 번에 문제를 해결한 코드를 보니 직접 배열로 스택을 구현하여 스택의 내부 동작 방식을 구현하였다.
두 코드 다 통과가 되는 코드였지만 자바 내의 stack 클래스를 활용한 것(사진 중 위 코드에 해당)이 시간과 메모리가 더 작게 나왔다.
코드
- 배열로 구현한 stack
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
int N = sc.nextInt();
int size = 0;
int[] stack = new int[N];
for(int i = 0; i<N; i++){
switch(sc.next()){
// push 연산 수행
case "push":
int n = Integer.parseInt(sc.next());
stack[size] = n; // 스택 배열에 입력된 수 추가
size++; // size 늘려주기
break;
// pop 연산 수행
case "pop":
// size가 0보다 큰 경우에는
if (size>0){
// 가장 마지막 위치의 숫자 출력 후
sb.append(stack[size-1]).append('\n');
// 해당 숫자 초기화
stack[size-1] = 0;
// size 즐여주기
size--;
}
// size가 0보다 작은 경우에는
else{
// -1 출력
sb.append(-1).append('\n');
}
break;
// size 연산 수행
case "size":
// 이제까지 저장해둔 배열의 size 출력
sb.append(size).append('\n');
break;
// empty 연산 수행
case "empty":
// 배열의 size가 0일 때, 1 출력
if(size == 0){
sb.append(1).append('\n');
}
// 배열의 size가 0이 아닐 때, 0 출력
else{
sb.append(0).append('\n');
}
break;
// top 연산 수행
case "top":
// 배열의 size가 0일 때, -1 출력
if(size == 0){
sb.append(-1).append('\n');
}
// 배열의 size가 0이 아닐 때, 가장 마지막 위치의 숫자 출력
else{
sb.append(stack[size-1]).append('\n');
}
break;
default:
break;
}
}
System.out.println(sb);
sc.close();
}
}
- 자바 내의 Stack 클래스 이용
import java.io.*;
import java.util.*;
class Main{
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
Stack<Integer> stack = new Stack<>();
for(int i = 0; i<N; i++){
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
String command = st.nextToken();
// push 연산을 위해 push() 메소드 이용
if(command.equals("push")) stack.push(Integer.parseInt(st.nextToken()));
// pop 연산을 위해 pop() 메소드 이용
else if(command.equals("pop")){
if (stack.isEmpty()) sb.append(-1).append("\n");
else sb.append(stack.pop()).append("\n");
}
// size 연산을 위해 size() 메소드 이용
else if (command.equals("size")) sb.append(stack.size()).append("\n");
// empty 연산을 위해 isEmpty() 메소드 이용
else if (command.equals("empty")){
if (stack.isEmpty()) sb.append(1).append("\n");
else sb.append(0).append("\n");
}
// top 연산을 위해 peek() 메소드 이용
else if(command.equals("top")){
if (stack.isEmpty()) sb.append(-1).append("\n");
else sb.append(stack.peek()).append("\n");
}
}
System.out.println(sb);
br.close();
}
}
728x90
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준] 10866번 덱(JAVA) (0) | 2022.07.28 |
---|---|
[백준] 10845번 큐(JAVA) (0) | 2022.07.28 |
[백준] 10816번 숫자 카드 2(JAVA) (0) | 2022.07.28 |
[백준] 10814번 나이순 정렬(JAVA) (0) | 2022.07.25 |
[백준] 10773번 제로(JAVA) (0) | 2022.07.25 |
댓글