hye-log

[백준]10828번 스택(JAVA) + 스택 직접 구현 본문

CodingTest/Baekjoon

[백준]10828번 스택(JAVA) + 스택 직접 구현

iihye_ 2023. 8. 18. 17:05

0. 문제 링크

https://www.acmicpc.net/problem/10828

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 

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
Comments