※ 복습용으로 작성했습니다.
※ 내용적인 면이 기억에 의존하다보니 부정확 할 가능성이 있습니다. 자세하고 정확한 이론과 풀이 방식은 시중에 파는 책이나 다른 블로그 가시는게 좋습니다.
※ 참고용으로만 보시길 바랍니다.
스택에 대한 이론은 생략
딱히 규칙도 없다. 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++;
}
}
}
'# 공부 > # 알고리즘' 카테고리의 다른 글
[스택] 괄호 :: 백준 알고리즘 9012번 C++ (0) | 2021.01.17 |
---|---|
[스택] 제로 :: 백준알고리즘 10773번 c++ (0) | 2021.01.17 |
[정렬] MergeSort 병합정렬 (0) | 2021.01.16 |
시간 복잡도 Time Complexity 계산 (0) | 2021.01.14 |
Procedural Dungeon Generation in Unity #2 (0) | 2020.07.24 |