[백준] 10828번 스택 JAVA (자바) 풀이
문제 10828번
: 아래와 같은 [명령] 스택으로 구현해보기
[명령]
push X | 정수 X를 스택에 넣는 연산 |
pop | 스택에서 가장 위에 있는 정수를 빼고 그 수를 출력, 스택에 정수가 없는 경우에 -1을 출력 |
size | 스택에 들어있는 정수의 개수 출력 |
empty | 스택이 비어있으면 1, 아니면 0 출력 |
top | 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력 |
[입력]
: 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)
: 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다
[출력]
: 명령 출력할 때마다 한 줄에 하나씩 출력
[스택]
: 스택은 나가고 들어오는 문이 하나다
: 후입선출 (최근에 들어온 데이터가 먼저 나간다)
예) 1 - 3 - 5 순서대로 push 하고 pop 하면 최근에 들어온 5가 나간다
[스택 연산]
init() | 스택을 초기화 |
create() | 스택을 생성 |
is_empty(s) | 스택이 비어있는지 검사 |
is_full(s) | 스택이 가득 찼는지 검사 |
push(e) | 스택의 맨 위에 요소 e 추가 |
pop(s) | 스택의 맨 위 요소를 삭제 |
peek(s) | 스택의 맨 위 요소를 삭제하지 않고 반환 |
top() | 스택 맨 위에 있는 데이터 값 반환 |
push() | 스택에 데이터 삽입 |
pop() | 스택에서 데이터 삭제하여 반환 |
isempty() | 스택에 원소가 없으면 'True', 있으면 'False' 값 반환 |
isfull() | 스택에 원소가 없으면 'False', 있으면 'True' 값 반환 |
* : 코드 구현에 사용된 것
[코드]
import java.io.*;
import java.util.*;
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));
Stack<Integer> stack = new Stack<>(); // 스택 선언
int n = Integer.parseInt(br.readLine()); // 첫째줄 입력 N
for (int i = 0; i < n; i++) {
String s = br.readLine(); // integer 안써도 돼
//contains, equals 차이
//contains: string 문자열에 포함되어있는지
//equals: string 문자열과 동일한지
if(s.contains("push")){
String spt[] = s.split(" ");
stack.push(Integer.parseInt(spt[1]));
//다른방법
//StringTokenizer st = new StringTokenizer(br.readLine());
//String s = st.nextToken();
//if(s.equals("push")){stack.push(Integer.parseInt(st.nextToken()));}
}
else if(s.contains("pop")){
if(stack.empty()){
bw.write(-1+"\n");
}
else{
bw.write(stack.pop()+"\n");
}
}
else if(s.contains("size")){
bw.write(stack.size()+"\n");
}
else if(s.contains("empty")){
if(stack.empty()){
bw.write(1+"\n");
}
else{
bw.write(0+"\n");
}
}
else if(s.contains("top")){
if(stack.empty()){
bw.write(-1+"\n");
}
else{
bw.write(stack.peek()+"\n");
}
}
}
bw.flush();
}
}
[해설]
: Stack<Integer> stack = new Stack<>(); 으로 스택선언
: for (int i = 0; i < n; i++) 대신에 while(n-->0) 써도 좋다
: if(s.contains)문으로 구현 시작
contains 대신에 equals를 써도 괜찮다
: s.split(" ")는 입력받은 문자열을 공백으로 구분하는 것
예를 들어 push 1 이라면 push와 1을 구분해 생각한다
spt[0] = push, spt[1] = 1
: 다른 명령어와 push는 조금 다르다
다른 것들은 특정 문자를 출력하는 명령어지만 push는 출력이 아닌 입력만 존재한다
즉 push 1 이라고 해서 1을 출력하는 것이 아닌 스택 안에 1을 입력만 하고 끝이다
그래서 다른 명령어와 달리 push에는 bw.write()가 없다
이제 풀어보러 갈께요 :)
https://www.acmicpc.net/problem/10828
10828번: 스택
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지
www.acmicpc.net
*독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *