[알고리즘][BAEKJOON][JAVA][Python]10828번, 스택
📑 이번 문제는 Stack 문제이다.
문제를 풀기전에 일단 Stack이 무엇인지 알아보는 시간을 가져볼까 한다.
1. Stack이란?
📌스택(Stack)이란?
- 사전적 정의 : '쌓다', '더미' 와 같다라고 생각하면 된다.
- 제한적으로 접근할 수 있는 나열 구조이다. 그 접근 방법은 언제나 목록의 끝에서만 일어난다. 끝먼저내기 목록(Pushdown list)이라고도 한다.
- 스택(Stack)은 LIFO(Last In First Out) 을 따른다. 즉 '선입후출' '후입선출'이라는 개념이다. 먼저 들어간 것은 나중에 나갈 수 있고, 나중에 들어간 것은 먼저 나갈 수 있는 것이다.
출처 : 위키백과
이렇게만 보면 무슨말인지 이해하기 굉장히 어렵다😅
그래서 우리는 쉬운 예로 '프링글스' 를 생각하면 편하다.
위에 있는 감자칩을 먹어야, 그 아래의 감자칩을 먹을 수 있고, 감자칩을 통 속에 넣을 때는 중간에 끼워 넣을 수 없다.
이렇게 쌓아가는 것이 Stack(스택)이다.
그림을 통해 Stack을 자세하게 살펴 보겠다.
1. 스택의 연산
📌 스택(Stack)의 연산
- pop(): 스택에서 가장 위에 있는 항목을 제거한다.
- push(item): item 하나를 스택의 가장 윗 부분에 추가한다.
- peek(): 스택의 가장 위에 있는 항목을 반환한다.
- isEmpty(): 스택이 비어 있을 때에 true를 반환한다.
2. 스택(Stack)의 사용 사례
- 재귀 알고리즘
- 웹 브라우저 방문기록(뒤로가기)
- 실행 취소(undo)
- 역순 문자열 만들기
- 수식의 괄호 검사(연산자 우선순위 표현을 위한 괄호 검사)
- 후위 표기법 계산
이 정도로 이해하고 이젠 Stack을 Java와 Python으로 구현해보도록 하겠다.
2. JAVA
1. 배열을 사용하여 직접 Stack 클래스 구현
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
class Stack{
private int top;
private int stackArr[];
public Stack(int size) {
this.top = -1;
this.stackArr = new int[size];
}
public void push(int x) {
this.stackArr[++top] = x;
}
public int pop() {
if(top == -1) return -1;
return this.stackArr[top--];
}
public int size() {
return this.top + 1;
}
public int empty() {
if(top == -1) return 1;
return 0;
}
public int top() {
if(top == -1) return -1;
else return this.stackArr[top];
}
}
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 stack = new Stack(n);
for(int i = 0;i<n;i++) {
String cons = br.readLine();
if(cons.contains("push")) {
String spt[] = cons.split(" ");
stack.push(Integer.parseInt(spt[1]));
}
else if(cons.contains("pop")) {
bw.write(String.valueOf(stack.pop())+"\n");
}
else if(cons.contains("size")) {
bw.write(String.valueOf(stack.size())+"\n");
}
else if(cons.contains("empty")) {
bw.write(String.valueOf(stack.empty())+"\n");
}
else if(cons.contains("top")) {
bw.write(String.valueOf(stack.top())+"\n");
}
}
bw.flush();
bw.close();
br.close();
}
}
2. Stack 라이브러리를 활용하여 구현
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
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++) {
String cons = br.readLine();
if(cons.contains("push")) {
String spt[] = cons.split(" ");
stack.push(Integer.parseInt(spt[1]));
}
else if(cons.contains("pop")) {
if(stack.empty()) bw.write(-1+"\n");
else bw.write(stack.pop()+"\n");
}
else if(cons.contains("size")) {
bw.write(stack.size()+"\n");
}
else if(cons.contains("empty")) {
if(stack.empty()) bw.write(1+"\n");
else bw.write(0+"\n");
}
else if(cons.contains("top")) {
if(stack.empty())bw.write(-1+"\n");
else bw.write(stack.peek()+"\n");
}
}
bw.flush();
bw.close();
br.close();
}
}
3. Python
python은 따로 Stack 구조를 제공하지 않으므로 기본 클래스 List를 이용하여 표현이 가능하다.
import sys
def push(x):
stack.append(x)
def pop():
if(not stack):
return -1
else:
return stack.pop()
def size():
return len(stack)
def empty():
return 0 if stack else 1
def top():
return stack[-1] if stack else -1
N = int(sys.stdin.readline().rstrip())
stack = []
for _ in range(N):
input_split = sys.stdin.readline().rstrip().split()
com = input_split[0]
if com == "push":
push(input_split[1])
elif com == "pop":
print(pop())
elif com == "size":
print(size())
elif com == "empty":
print(empty())
elif com == "top":
print(top())
처음에는 input을 사용했더니 런타임 오류로 계속 실패가 떠서 구글링을 해보니 입출력 속도 또한 비교를 해주어야하는 문제였다.
✔입출력 속도 비교 : sys.stdin.readline > raw_input() > input()
Author And Source
이 문제에 관하여([알고리즘][BAEKJOON][JAVA][Python]10828번, 스택), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@aok458/알고리즘BAEKJOONJAVAPython10828번-스택저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)