본문 바로가기
백준

[스택, 배열] 28278 : 스택2

by 송파감자 2023. 9. 13.

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

 

28278번: 스택 2

첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000) 둘째 줄부터 N개 줄에 명령이 하나씩 주어진다. 출력을 요구하는 명령은 하나 이상 주어진다.

www.acmicpc.net


저번주 벡터로 풀어 봤던 스택문제를 이번엔 배열과 클래스를 이용해서 짜봤다.

근데 출력초과가 뜨는 것이 아닌가? 출력하지 말아야 할 것을 출력하면 뜨는 오류라고 했다. 곰곰히 다시 보니 2번에서 출력오류가 났다.

 

2번 명령 : 스택에 정수가 있다면 맨 위의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.

 

무슨 오해냐? 

나는 맨위를 삭제하고, 나머지 정수를 출력하라고 하는 줄 알았다... 하지만 삭제한 그 애를 출력하라는 얘기였다.

그걸 고치는 시간 초과가 나는 것 아닌가?

 

저번에 endl 을 개행문자로 바꾸니 해결되어 아래와 같이 수정하니 겨우 통과함..

하지만 아주 만족한다! 

계속 C스타일로 짜다가 클래스를 써서 문제 푼 건 처음이라 꽤 만족스럽다. 

/*23-09-13*/
#include <iostream>
using namespace std;

class Stack
{
public:
	Stack() : Top(0), AryP(nullptr), Capacity(0)
	{
		const int FirstCapacity = 10;
		AryP = new int[FirstCapacity];
		Capacity = FirstCapacity;
	};
	~Stack() { delete[] AryP; };

public:
	int GetCount() { return Top; }

	/*1번 스택 넣기*/
	void PushToStack(int Num)
	{
		// 맨 처음 시작하면 10개 정도 잡아준다
		if (AryP == nullptr)
		{
			Capacity = 10;
			AryP = new int[Capacity];
		}

		// Top과 용량이 같아지면 용량 2배 늘려준다
		if (Top == Capacity)
		{
			Capacity *= 2;
			int* NewAryP = new int[Capacity];
			for (int i{ 0 }; i < Top; ++i)
			{
				NewAryP[i] = AryP[i];
			}
			delete[] AryP;
			AryP = NewAryP;
		}

		AryP[Top++] = Num;
	}

	/*2번 스택 정수 있는지 확인 후 맨위 빼고 걔를 출력, 없으면 -1출력*/
	void PopTopPrint()
	{
		if (IsStackEmpty() == true)
		{
			cout << -1 << '\n';
		}
		else
		{
			// 맨 위 정수 제거하고
			if (Top > 0)
			{
				// 그 제거한 애를 출력한다
				cout << AryP[Top - 1] << '\n';
				Top--;
			}
		}
	}

	/*3번 스택 정수 갯수 출력*/
	void PrintStackSize()
	{
		cout << Top << '\n';
	}

	/*4번 스택 비어있나 확인. 비면 1 아님 0출력. 출력은 밖에서..*/
	bool IsStackEmpty()
	{
		bool IsEmpty{ true };

		if (Top == 0)
			IsEmpty = true;
		else
			IsEmpty = false;

		return IsEmpty;
	}
	void PrintEmptyOrNot(bool bEmpty)
	{
		if (bEmpty == true)
			cout << 1 << '\n';
		else
			cout << 0 << '\n';
	}

	/*5번 !StaickIsEmpty 면 맨 위 정수top 출력 IsEmpty면 -1출력*/
	void CheckStackIsEmpty()
	{
		if (IsStackEmpty() == true)
			cout << "-1" << '\n';
		else
		{
			// 꼭대기 (top-1)
			cout << AryP[Top - 1] << '\n';
		}
	}


private:
	int Top; // 스택의 비어있는 곳 = 스택의 크기
	int* AryP;
	int Capacity; // 배열의 용량(메모리 할당 어느 정도 해주려구)
};

int main()
{
	int N{}; // 명령의 수
	cin >> N;

	int X{}; // 명령 
	Stack S;

	while (N > 0)
	{
		N--;
		cin >> X;

		// X에 맞는 함수 불러줘야 함
		if (X == 1)
		{
			int Temp{};
			cin >> Temp;
			S.PushToStack(Temp);
		}
		else if (X == 2)
		{
			S.PopTopPrint();
		}

		else if (X == 3)
		{
			S.PrintStackSize();
		}

		else if (X == 4)
		{
			S.PrintEmptyOrNot(S.IsStackEmpty());
		}

		else if (X == 5)
		{
			S.CheckStackIsEmpty();
		}
	}

	return 0;
}

 

 

 

 

'백준' 카테고리의 다른 글

[스택] 10773, 벡터 사용한 스택  (0) 2023.09.08
[스택 & 벡터] 28278  (0) 2023.09.05
공백 입력..!!  (0) 2023.08.08
(2562번)최댓값 찾고 몇 번째 숫자인지 찾기  (2) 2023.04.19
[버블정렬 & 벡터] 10818번 문제  (0) 2023.04.19