C# 프로그래밍 기초 실습 전자책

C# / .NET 알고리즘과 퀴즈
본 알고리즘 퀴즈 문제는 C#/.NET 개발자를 위한 알고리즘 인터뷰 혹은 C# 프로그래밍을 통한
문제 해결 알고리즘을 연구해 보는데 도움이 되고자 작성되었습니다.


퀴즈 질문


예상답변/설명

스택은 모든 요소들을 Pop하기 이전에는 그 값들을 엑세스할 수 없다는 단점이 있다. 기껏해야 스택 맨 위에 있는 요소(Top)만을 Peek()를 통해 알 수 있는 정도이다.

따라서 최소값을 갖는 요소를 구하기 위해서는 스택에 요소를 추가할 때, 최소값에 대한 정보를 함께 저장해야 한다. 예를 들어, 매번 요소가 추가될 때, 기존 최소값과 추가되는 요소 값을 비교하여 추가 요소가 더 작으면 현재 요소까지의 최소값은 새로 추가되는 요소값이 된다. 따라서 스택에 요소 값을 저장할 때, 요소값과 함께 그 요소까지의 최소값을 함께 저장하면 Min() 메서드 는 O(1) 의 Time Complexity를 갖게 된다. 하지만, 이러한 방식은 스택의 메모리가 요소값 저장소의 2배를 차지한다는 단점이 있다.

이러한 단점을 해결하기 위해 별도의 최소값 전용 스택을 내부에 두고 최소값에 변동이 있을 때에만, 즉 추가 요소값이 기존 최소보다 작은 경우에만, 최소값 스택에 추가하는 방식을 생각해 볼 수 있다. 아래는 이러한 방식을 이용한 코드 샘플이다.

class MinStack
{
    Stack<int> _stack = new Stack<int>();
    Stack<int> _minstk = new Stack<int>();

    public void Push(int value)
    {
        _stack.Push(value);

        if (_minstk.Count == 0 || value < _minstk.Peek())
        {
            _minstk.Push(value);
        }
    }

    public int Pop()
    {
        int value = _stack.Pop();
        if (value == _minstk.Peek())
        {
            _minstk.Pop();
        }
        return value;
    }

    public int Min()
    {
        return _minstk.Peek();
    }
}