Notice
Recent Posts
Link
- Today
- Total
hye-log
[백준]10828번 스택(JAVA) + 스택 직접 구현 본문
0. 문제 링크
https://www.acmicpc.net/problem/10828
1. 문제 설명
1) 정수를 저장하는 스택을 만들어 입력으로 주어지는 명령을 처리하는 프로그램 만들기
2. 입출력
// input
14 // 명령의 수
push 1
push 2
top
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
top
// output
2
2
0
2
1
-1
0
1
-1
0
3
3. 코드
import java.io.*;
import java.util.*;
public class b10828 {
public static void main(String[] args) throws NumberFormatException, IOException {
// System.setIn(new FileInputStream("input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = null;
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine()); // 명령의 수
Stack<Integer> stack = new Stack<Integer>(); // 스택
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine()); // 한 줄 읽기
String command = st.nextToken(); // 명렁어
switch(command) {
case("push"):
int value = Integer.parseInt(st.nextToken()); // 이어서 정수 하나 읽기
stack.add(value); // stack에 추가
break;
case("top"):
if(stack.isEmpty()) { // 비어 있으면 -1
sb.append(-1 + "\n");
} else { // 비어 있지 않으면 가장 위에 있는 정수
sb.append(stack.peek() + "\n");
}
break;
case("size"):
sb.append(stack.size() + "\n"); // 스택의 크기
break;
case("empty"):
if(stack.isEmpty()) { // 비어 있으면 1
sb.append(1 + "\n");
} else { // 비어 있지 않으면 0
sb.append(0 + "\n");
}
break;
case("pop"):
if(stack.isEmpty()) { // 비어 있으면 -1
sb.append(-1 + "\n");
} else { // 비어 있지 않으면 가장 위에 있는 정수 하나 꺼내기
sb.append(stack.pop() + "\n");
}
break;
}
}
bw.write(sb.toString()); // bw로 내보내기
bw.flush();
bw.close();
}
}
실행 결과
4. 회고
1) Stack 자료구조를 이용하여 command에 따라 출력하도록 구현함
2) 이 문제의 진짜 의도는 Stack을 직접 구현하는 것이 아닐까...
- Index 에러를 겪지 않기 위해서는 초기 배열의 크기를 10000으로 지정해야 한다
import java.io.*;
import java.util.*;
@SuppressWarnings("hiding")
class MyStack<Integer>{
private int[] stack;
private int top = -1;
private int size;
public MyStack() {
this(10000); // 처음 사이즈는 10000으로 초기화
}
public MyStack(int size) {
this.size = size;
stack = new int[size];
}
public void push(int value) {
top++;
stack[top] = value;
}
public int top() {
if(top < 0) {
return -1;
}
else return stack[top];
}
public int size() {
return top + 1;
}
public int empty() {
if(top < 0) {
return 1;
}
else return 0;
}
public int pop() {
if(top < 0) {
return -1;
}
else return stack[top--];
}
}
public class b10829_stack {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = null;
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine()); // 명령의 수
MyStack<Integer> stack = new MyStack<Integer>();
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine()); // 한 줄 읽기
String command = st.nextToken(); // 명렁어
switch(command) {
case("push"):
int value = Integer.parseInt(st.nextToken()); // 이어서 정수 하나 읽기
stack.push(value); // stack에 추가
break;
case("top"):
sb.append(stack.top() + "\n");
break;
case("size"):
sb.append(stack.size() + "\n");
break;
case("empty"):
sb.append(stack.empty() + "\n");
break;
case("pop"):
sb.append(stack.pop() + "\n");
break;
}
}
bw.write(sb.toString()); // bw로 내보내기
bw.flush();
bw.close();
}
}
5. Github
728x90
'CodingTest > Baekjoon' 카테고리의 다른 글
[백준]1018번 체스판 칠하기(JAVA) (0) | 2023.08.18 |
---|---|
[백준]10989번 수 정렬하기 3(JAVA) (0) | 2023.08.18 |
[백준]1436번 영화감독 숌(JAVA) (0) | 2023.08.15 |
[백준]1181번 단어 정렬(JAVA) (0) | 2023.08.15 |
[백준]1074번 Z(JAVA) (0) | 2023.08.14 |
Comments