본문 바로가기
# 공부/# 알고리즘

[스택] 백준알고리즘 10828번 c++

by 쁘레레레레레 2021. 1. 17.

※ 복습용으로 작성했습니다.

※ 내용적인 면이 기억에 의존하다보니 부정확 할 가능성이 있습니다. 자세하고 정확한 이론과 풀이 방식은 시중에 파는 책이나 다른 블로그 가시는게 좋습니다.

※ 참고용으로만 보시길 바랍니다.

 

스택에 대한 이론은 생략

딱히 규칙도 없다. LIFO(Last In First Out) 이 조건만 지켜주면 된다.

 

해당 문제엔 이러한 명령어들의 조건이 있다.

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

그리고 밑에 예시가 나와있는데 해당 페이지에 있으니 역시 생략한다.

 

여기서 별 생각할건 없다. 굉장히 간단한 문제인데 아무래도 1년넘게 안했다보니 string 템플릿의 사용법을 까먹었었다.

 

여기서 유심히 봐야할건 명령어는 push를 빼고선 전부 단순히 입력하면 된다.

 

즉 if문으로 걸러주면 된다.

 

char배열로 선언해 걸러주어도 편하지만, string을 써봤다.

 

문자열을 다른곳에선 compare를 써라.. find로 찾고 0이상일때로 걸러라 등등 있는데

 

왜 그런 소리를 하는지 정말 하나도 모르겠다.. 의미 없는 코드라는 뜻

 

find코드를 쓸 때 다른블로그에선 잘못 설명한 부분이 있는데, 여과가 필요한 스트링 배열에서 find내의 문자열이 존재하지 않으면 0 미만으로 뜨니 0 이상으로 걸러주면 된다.. 이런 소리가 있었다.

 

근데 그건 헛소리다.

 

정확한 값을 반복적으로 재본적은 없으나 꽤 큰 값이 나왔었다.

 

또 해당 스트링 배열에 어떠한 수가 들어갈지 모르기에 

 

string::npos 를 써주면 된다.

 

스트링 배열에서 find를 할때 해당 문자열을 찾지 못할경우 npos를 반환한다고 적혀있기에 그걸로 걸러버리면 끝

 

이제 문제는 push다.

 

내가 한 방식은 주먹구구 방식이다.

 

사실 블랭크를 찾아서 그 부분 +1 기점에서 끝까지 읽어버리면 되는건데

 

어차피 이 문제에선 push외엔 공백이나 숫자가 들어가는 명령어가 없기에

push + 공백까지해서 6번째인 5번배열부터 읽는다고 해주면 된다.

 

이후 stoi함수로 스트링 배열을 정수형으로 바꿔주고 그 값을 해당 배열에 비어있는 값에 넣어주면 된다.

 

밑엔 정답 코드

 

#include <iostream>
#include <string>

using namespace std;

int main()
{
	int nInputIter = 0;
	int arData[10000]{};
	cin >> nInputIter;
	string sInputData{};
	int nArraySize{};

	cin.ignore();

	for (int i = 0; i < nInputIter; i++)
	{

		std::getline(cin, sInputData);

		if (sInputData.find("pop") != string::npos)
		{
			if (nArraySize < 1)
				cout << "-1" << endl;
			else
			{
				cout << arData[nArraySize - 1] << endl;
				arData[nArraySize - 1] = 0;
				nArraySize--;
			}
		}
		else if (sInputData.find("size") != string::npos)
		{
			printf("%d\n", nArraySize);
		}
		else if (sInputData.find("empty") != string::npos)
		{
			if (nArraySize >= 1)
			{
				cout << "0" << endl;
			}
			else if (nArraySize < 1)
			{
				cout << "1" << endl;
			}
		}
		else if (sInputData.find("top") != string::npos)
		{
			if (nArraySize < 1)
				cout << "-1" << endl;
			else
			{
				cout << arData[nArraySize - 1] << endl;
			}
		}
		else if (sInputData.find("push") != string::npos)
		{
			string sTmp = sInputData.substr(5);
			int nTmp = stoi(sTmp);
			arData[nArraySize] = nTmp;
			nArraySize++;
		}
	}

}