간단히 스택을 구현하는 문제입니다. 그렇게 어렵지 않은 문제라 생각하고 빨리 풀 줄 알았으나.. 예제 입력을 받을 때 문자열 입력 관련하여 신경 쓸 부분이 많아 오래 걸렸습니다.. ㅜㅜ 문제를 풀고 난 후 고수 개발자님의 코드를 참고해보니 나름 해결했다고 한 것도 결국엔 삽질한 것 같습니다만 해당 과정을 자세히 포스팅해보겠습니다. 아래는 제출한 코드입니다.
#include<iostream>
#include<string>
using namespace std;
#define SIZE 10000
class Stack
{
private:
int stack[SIZE];
int index = 0;
public:
void push(int n);
int pop();
int size();
bool full();
bool empty();
int top();
};
void Stack::push(int n)
{
if (full()) cout << "스택이 가득 차 " << n << "을 스택에 삽입할 수 없습니다." << endl;
else stack[index++] = n;
}
int Stack::pop()
{
if (empty()) return -1;
else return stack[--index];
}
int Stack::size()
{
return index;
}
bool Stack::full()
{
if (index == SIZE) return true;
else return false;
}
bool Stack::empty()
{
if (index == 0) return true;
else return false;
}
int Stack::top()
{
if (empty()) return -1;
else return stack[index - 1];
}
int main(void)
{
Stack stack;
int n; cin >> n;
cin.ignore();
for (int i = 0; i < n; i++) {
string str; getline(cin, str);
if (str.find("push ") != string::npos) {
int num = stoi(str.substr(5));
stack.push(num);
}
else if (str.find("pop") != string::npos) {
cout << stack.pop() << endl;
}
else if (str.find("size") != string::npos) {
cout << stack.size() << endl;
}
else if (str.find("empty") != string::npos) {
cout << stack.empty() << endl;
}
else {
cout << stack.top() << endl;
}
}
return 0;
}
먼저 먼저 예제 입력으로 들어올 수 있는 문자열은 push X, pop, size, empty, top으로 총 5가지입니다. 이 중 push X의 경우 띄어쓰기가 포함된 문자열이다 보니 cin 대신 getline 함수를 사용하게 되었습니다. (cin의 경우 공백을 만나면 입력이 종료됨) 첫 번째 발생한 문제가 문자열을 입력받지 않았는데 아래쪽 if문이 실행된다는 거였는데 윗부분에 명령의 개수를 입력받는 cin >> n 때문이었습니다. 알아보니 정숫값을 입력할 때 누른 엔터 때문에 버퍼에 엔터("\n")가 남아있어 getline 함수에 바로 들어간다고 합니다. 해당 사항은 cin >> n 바로 다음 줄에 cin.ignore() 함수를 사용함으로써 버퍼의 모든 내용을 지워 해결하였습니다. 그 후 push X가 입력된 경우 find 함수를 통해 "push "가 포함된 문자열이면 substr() 함수를 사용해 "push "이후의 문자열을 정수로 바꿔(stoi 함수 사용) 스택에 저장해주었는데요. 다른 고수 개발자님의 코드를 참고해보니 push X가 공백이 포함된 문자열이라는 것을 이용해 오히려 문자열 부분과 정수 부분을 따로 입력받는 코드를 짜셨더라구요..
int main(void)
{
Stack stack;
int n; cin >> n;
for (int i = 0; i < n; i++) {
string str; cin >> str;
if (str == "push") {
int num; cin >> num;
stack.push(num);
}
else if (str == "pop") {
cout << stack.pop() << endl;
}
else if (str == "size") {
cout << stack.size() << endl;
}
else if (str == "empty") {
cout << stack.empty() << endl;
}
else {
cout << stack.top() << endl;
}
}
return 0;
}
공백으로 구분하여 여러 정수를 입력하거나 하는 경우는 매번 있는 일이었는데 빙글빙글 돌아 코드를 어렵게 짠 것 같습니다. 약 2~3년 전 배웠던 스택을 다시 한번 복습해볼 수 있었던 문제였고, 오늘도 삽질(?) 덕에 의도치 않게 내공이 좀 쌓인 것 같습니다.
'알고리즘 > 백준' 카테고리의 다른 글
[백준/C,C++] 17298번: 오큰수 (0) | 2021.03.03 |
---|---|
[백준/C,C++] 1874번: 스택 수열 (0) | 2021.03.03 |
[백준/C,C++] 4949번: 균형잡힌 세상 (0) | 2021.03.03 |
[백준/C,C++] 9012번: 괄호 (0) | 2021.03.02 |
[백준/C,C++] 10773번: 제로 (0) | 2021.03.01 |
댓글