본문 바로가기
백준/코딩연습1

[백준] 스택 (10828)(java)

by 유줘니 2019. 5. 15.

원본 문제 : https://www.acmicpc.net/problem/10828

 

문제

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

명령은 총 다섯 가지이다.

  • 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

 

 

 

문제 풀이1

 

스택을 이용하면 쉽게 풀 수 있는 문제였다.

하지만 코딩을 하면서 입력이 제대로 이루어지지 않는 문제가 있었다.

 

숫자와 문자열 여러개를 동시에 입력 받을 때,

Scanner의 nextInt()메소드는 엔터키도 입력으로 인식을 하는 문제가 있었다.

이를 해결하기 위해 Scanner의 nextLine()메소드로 입력을 받았고

Integer클래스의 parseInt로 String을 int형식으로 변환했다.

 

다른 문제는 여러개의 문자열을 입력 받을 때,

Scanner의 next() 메소드는 띄어쓰기를 구분해 입력을 받는다.

예를 들어 "push 1"이라고 입력을 받을 때, "push"와 "1"을 개별적 입력으로 인식을 하는 문제가 있었다.

이를 해결하기 위해 nextLine()메소드를 이용하였다.

 

마지막으로 stack_func함수에서 "push"를 발견했을 때

String클래스의 substring으로 문자를 추출하는 기능인데,

substring(시작index, 끝index)으로 글자를 추출해 stack에 push하려 했지만,

이상하게 추출한 문자 값이 공백으로만 나와

번거롭게 String배열을 선언하여 split메소드를 이용해 글자를 분리하였다.

import java.util.Scanner;
import java.util.Stack;

public class Main {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		int n = Integer.parseInt(sc.nextLine());
		Stack<String> stack = new Stack<String>();
		
		String[] str = new String[n];
		for(int i = 0; i < n ; i++)
			str[i] = sc.nextLine();	
		
		stack_func(str, stack);
		
	}
	
	public static void stack_func(String[] str, Stack<String> stack) {
		for(int i = 0; i < str.length ; i++) {
			if(str[i].contains("push")) {
				String arr[];
				arr = str[i].split(" ");
				stack.add(arr[1]);
			}
			else if(str[i].contains("pop")) {
				if(stack.isEmpty())
					System.out.println("-1");
				else
					System.out.println(stack.pop());
			}
			else if(str[i].contains("size"))
				System.out.println(stack.size());
			else if(str[i].contains("empty")) {
				if(stack.isEmpty())
					System.out.println("1");
				else
					System.out.println("0");
			}
			else if(str[i].contains("top")) {
				if(stack.isEmpty())
					System.out.println("-1");
				else
					System.out.println((String)stack.peek());
			}
		}
	}
}

댓글