(C++) 백준 10828번 - 스택

코딩너구리·2025년 10월 13일

코딩 문제 풀이

목록 보기
30/266

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

문제

> 정수를 저장하는 스택을 구현한 다음 입력으로 주어지는 명령을 처리해라.
>  명령은 아래와 같다.

명령

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

접근

입력 명령(문자열)에 대한 동작을 정의하고 입력으로 들어오면 해당 동작을 처리한다.

문제해결

> 명령어의 개수를 N으로 입력받는다. 입력받고 난 뒤 보이지 않는 \n이 남아 있어 밑에 getline에서 cin이 이를 읽기 때문에 ignore()로 제거 해준다.
> 명령을 입력받고 string stream을 이용해 push명령을 처리한다. 공백을 기준으로 숫자가 있으면 num에 담기고 없으면 안담긴다.
> 입력받은 명령에 따라 stack명령어와 비교해 처리한다. pop은 맨위에 요소를 제거하고 그 수를 출력하는건데 먼저 pop하면 다른 요소가 출력되므로 먼저 출력하고 제거한다.

코드

#include <iostream>
#include <algorithm>
#include <string>
#include <stack>
#include <sstream>
using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	int N;
	cin >> N;
	cin.ignore();

	stack<int> stack;
	while (N--)
	{
		string s, str;
		int num;

		getline(cin, s);
		stringstream stm(s);
		stm >> str;
		stm >> num;

		if (str == "push") stack.push(num);

		else if (str == "pop")
		{
			if (!stack.empty())
			{
				cout << stack.top() << '\n';
				stack.pop();
			}
			else cout << -1 << '\n';
		}

		else if (str == "size") cout << stack.size() << '\n';

		else if (str == "empty") cout << stack.empty() << '\n';

		else if (str == "top")
		{
			if (stack.empty())
			{
				cout << -1 << '\n';
			}
			else cout << stack.top() << '\n';
		}
	}
}

후기

코드는 제대로 작동하는데 자꾸 한 줄 덜 입력했는데 끝나길래 고민을 좀 했다. 알고 보니 보이지 않는 \n가 N입력뒤에 숨어 getline에 문제를 일으켰다. getline을 쓸땐 이를 주의하고 꼭 ignore()을 염두하자.
stringstream에 대해 처음 써보았다. 공백으로 파싱해서 substr쓰고 할까 했지만 코드가 길어져 줄여보고 싶어 공부했다. 두 줄 딸깍으로 문자열, 숫자가 받아지고 숫자가 없어도 알아서 안받고 편했다. 새로운 기능들이 push()되고 있어서 좋다.

0개의 댓글