🔔 문제

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

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
0.5 초 (추가 시간 없음) 256 MB 139124 53138 38280 38.157%

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 다섯 가지이다.

  • push X: 정수 X를 스택에 넣는 연산이다.
  • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 스택에 들어있는 정수의 개수를 출력한다.
  • empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
  • top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

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

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

예제 입력 1

14
push 1
push 2
top
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
top

예제 출력 1

2
2
0
2
1
-1
0
1
-1
0
3

예제 입력 2

7
pop
top
push 123
top
pop
top
pop

예제 출력 2

-1
-1
123
123
-1
-1

출처

알고리즘 분류


🔐 해결 (소스 코드)

import java.util.Scanner;

public class Main {
	public static int[] stack;
	public static int size = 0;
	
	public static void main(String[] args) {
        // Scanner와 StringBuilder를 사용한 풀이
		Scanner sc = new Scanner(System.in);
		StringBuilder sb = new StringBuilder();
		
		int N = sc.nextInt();
		stack = new int[N];
		
		for (int i=0; i<N; i++) {
			String command = sc.next();
			
			switch (command) {
			case "push":
				push(sc.nextInt());
				break;
			
			case "pop":	
				sb.append(pop()).append('\n');
				break;
			
			case "size":
				sb.append(size()).append('\n');
				break;
			
			case "empty":
				sb.append(empty()).append('\n');
				break;
				
			case "top":
				sb.append(top()).append('\n');
				break;
			}
		}
		System.out.println(sb);
	}
	private static void push(int item) {
		stack[size] = item; // push할 요소를 스택에 추가하면
		size++; // size 수 올림
	}
	
	private static int pop() {
		if (size == 0) {
			return -1;
		} else {
			int result = stack[size - 1];
			stack[size - 1] = 0;
			size--;
			return result;
		}	
	}
	
	private static int size() {
		return size;
	}
	
	private static int empty() {
		if (size == 0) {
			return 1;
		} else {
			return 0;
		}
	}
	
	private static int top() {
		if (size == 0) {
			return -1;
		} else {
			return stack[size - 1];
		}
	}
}

🧩 배운점

1. StringBuilder 사용

String에 concat 혹은 +를 여러번 하면 속도가 너무 느려져 비효율적이므로, 그때는 .append(), .delete() 등을 통해서 값을 변경할 수 있다.

여기서는 StringBuilder.append를 사용했다.

  • sb.append(값)
  • StringBuffer, StringBuilder 뒤에 값을 붙인다
  • 여기서는 함수 실행 결과에다가, 개행문자를 붙이는 용도로 사용했음

※ 참고한 글 : https://wakestand.tistory.com/245

2. 자바로 알고리즘 푸는 감

그간 파이썬으로만 알고리즘, 자료구조 문제를 다뤄서 자바로 문제를 푸는 것에 대해 막막한 부분들이 많았다. 하지만, 이번 문제 해결을 계기로 하나씩 하나씩 배우고, 성장해나가고, 한 계단 한 계단 올라가면 되겠다는 생각이 들었다.

파이썬으로 알고리즘을 잘 푸는 수준이라고 생각이 들지는 않지만, 자바로 푸는거는 파이썬과 비교하면 매우 많이 부족한 수준이다.

자바 개발자로서, 나를 위해서 자바로도 어느정도 난이도의 문제를 풀 수 있어야겠다. 실력 성장을 위해 더 화이팅~!!! 💪


👣 참고하기

ⓐ 스택(Stack) 강의 정리노트 보기

맨 위로 이동하기

Leave a comment