[알고리즘 스터디] 2주차_스택_코드업 3117

·2022년 10월 28일
2

Algorithm Study

목록 보기
37/77
post-custom-banner

당신의 상관은 당신이 작년에 회사의 실적에 얼마나 도움이 되었는지 횟수를 세었다.
불행히도 당신의 상관은 때때로 횟수를 틀리게 읽는다.
다행히도 당신의 상관은 잘못된 숫자를 읽은 것을 인식하면 ‘zero’라고 말한다.
이는 ‘직전의 숫자는 무시한다’는 것을 의미한다.
불행히도 당신의 상관은 실수를 반복할 수 있고, 매 실수 마다 ‘zero’라고 말한다.
예를 들면 당신의 상관이 ‘One, three, five, four, zero, zero, seven, zero, zero, six’라고 말한 것은
7을 의미하는 것인데 다음의 표를 보면 알 수 있다.

상관의 명령현재 숫자설명
"one, three, five, four"1, 3, 5, 44개의 숫자를 기록
"zero, zero"1, 3마지막 두 숫자를 삭제
"seven"1, 3, 7이전의 숫자 끝에 7을 추가
"zero, zero"1마지막 두 숫자를 삭제
"six"1, 6마지막 남은 숫자들, 합은 7

어느 순간이나 당신의 상관은 ‘zero’라고 말할 수 있으며, 만약 모든 숫자들이 무시되면 그 합은 0이 된다.
상관이 말하는 문구를 입력받아 정확한 합을 구하는 프로그램을 작성하시오.

#include <iostream>

using namespace std;

enum { eMaxCount = 100001, eInvalid = -1 };

class Stack
{
public:
    Stack()
        : muTopIndex(0u)
        , StackSize(0)
    {
    }

    void Push(int _iData)
    {
        if (eMaxCount <= muTopIndex)
        {
            cout << "Stack overflow!" << endl;
            return;
        }

        StackSize++;
        miarrData[muTopIndex++] = _iData;
    }

    bool IsEmpty(void)
    {
        return -1 == muTopIndex;
    }

    int Size()
    {
        return StackSize;
    }

    int Top(void)
    {
        if (true == IsEmpty())
        {
            cout << "Stack underflow!" << endl;
            return eInvalid;
        }

        return miarrData[muTopIndex];
    }

    void Pop(void)
    {
        if (true == IsEmpty())
        {
            cout << "Stack underflow!" << endl;
            return;
        }

        StackSize--;
        muTopIndex--;
    }

private:
    int             miarrData[eMaxCount];
    unsigned int    muTopIndex;
    int             StackSize;
};

int main()
{
    int NumCount = 0;
    int Sum = 0;
    Stack* StackStorage = new Stack();

    cin >> NumCount;
    
    for (int i = 0; i < NumCount; i++)
    {
        int InputNum = 0;
        cin >> InputNum;

        if (InputNum != 0)
        {
			StackStorage->Push(InputNum);
		}
		else // 입력 받은 숫자가 0이면
		{
			if (i != 0) // 인덱스가 0이 아니면 (-인덱스 안되게)
			{
				StackStorage->Pop();
			}
		}
	}

	int Index = 0;

	StackStorage->Pop();

    if (StackStorage->Size() == 0)
    {
        Sum += StackStorage->Top();
    }
    else
    {
        int Size = StackStorage->Size();

        for (int i = 0; i <= Size; i++)
        {
            Sum += StackStorage->Top();

            if (StackStorage->Size() != 0)
            {
                StackStorage->Pop();
            }
        }
    }

	std::cout << Sum;
}

post-custom-banner

1개의 댓글