코딩고치

[백준][자료구조]스택 수열 본문

백준 알고리즘 기초/자료구조

[백준][자료구조]스택 수열

코딩고치 2019. 9. 4. 04:15


스택을 이용하여 수열을 만드는 프로그램을 만드는 문제이다. 스택은 LIFO의 특성을 가지고 있어서 가장 마지막에 입력한 데이터 만을 꺼낼 수 있고 다른 데이터들은 꺼내지 못한다.  스택의 이런 성질을 이용하여 수열을 입력받았을 때 스택을 이용하여 수열을 만들 수 있는지와 push와 pop연산의 수행을 확인하는 코드를 작성해야 한다.

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

int main(void)
{
	int n;
	int arr[100000];
	stack<int> sta;
	string str;

	cin >> n;
	int a = 0;
	for (int i = 0; i < n; i++)
	{
		cin >> arr[i];
		if (sta.empty())	//스택이 비어있을 때(초기 입력값)
		{
			while (arr[i] > a) // 1부터 초기값까지 스택에 push
			{
				sta.push(++a);	
				str += '+';		// '+' 문자열에 추가
			}
			sta.pop();	//입력값 pop
			str += '-';
		}
		else	// 2~n번째 입력값, sta.top와 비교
		{
			if (sta.top() == arr[i])
			{
				sta.pop();				
				str += '-';
			}
			else if (arr[i] > sta.top())	
			{
				while (arr[i] > a)		
				{
					sta.push(++a);
					str += '+';
				}
				sta.pop();
				str += '-';
			}
			else if (arr[i]<sta.top())	// LIFO!!
			{
				cout << "NO" << '\n';	
				return 0;
			}
		}
	}
	for (char ch : str)
	{
		cout << ch << '\n';
	}
	return 0;
}

프로그램은 제대로 작동하지만 while문이 같은 코드가 중복이 된다. 좀 더 가다듬어야 할 것 같다.

			else if (arr[i] > sta.top())	
			{
				while (arr[i] > a)		
				{
					sta.push(++a);
					str += '+';
				}
				sta.pop();
				str += '-';
			}

 

 

'백준 알고리즘 기초 > 자료구조' 카테고리의 다른 글

[백준][자료구조]조세퍼스 문제  (0) 2019.09.05
[백준][자료구조]큐  (0) 2019.09.05
[백준][자료구조]에디터  (0) 2019.09.05
[백준][자료구조]괄호  (0) 2019.09.04
[백준][자료구조]스택  (0) 2019.09.03
Comments