[BOJ][C++][Python] 백준 1874번 스택 수열

Updated:

1874번 스택 수열

1. 문제 정보

백준 온라인 저지 [1874번 스택 수열] 문제의 링크입니다.

문제

스택 (stack)은 기본적인 자료구조 중 하나로, 컴퓨터 프로그램을 작성할 때 자주 이용되는 개념이다. 스택은 자료를 넣는 (push) 입구와 자료를 뽑는 (pop) 입구가 같아 제일 나중에 들어간 자료가 제일 먼저 나오는 (LIFO, Last in First out) 특성을 가지고 있다.
1부터 n까지의 수를 스택에 넣었다가 뽑아 늘어놓음으로써, 하나의 수열을 만들 수 있다. 이때, 스택에 push하는 순서는 반드시 오름차순을 지키도록 한다고 하자. 임의의 수열이 주어졌을 때 스택을 이용해 그 수열을 만들 수 있는지 없는지, 있다면 어떤 순서로 push와 pop 연산을 수행해야 하는지를 알아낼 수 있다. 이를 계산하는 프로그램을 작성하라.

입력

첫 줄에 n (1 ≤ n ≤ 100,000)이 주어진다. 둘째 줄부터 n개의 줄에는 수열을 이루는 1이상 n이하의 정수가 하나씩 순서대로 주어진다. 물론 같은 정수가 두 번 나오는 일은 없다.

출력

입력된 수열을 만들기 위해 필요한 연산을 한 줄에 한 개씩 출력한다. push연산은 +로, pop 연산은 -로 표현하도록 한다. 불가능한 경우 NO를 출력한다.


예제 입력1

8
4
3
6
8
7
5
2
1

예제 출력1

+
+
+
+
-
-
+
+
-
+
+
-
-
-
-
-

예제 입력2

5
1
2
5
3
4

예제 출력2

NO

시간 / 메모리 제한

2초 / 128MB

힌트

1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.


2. 생각

  1. 1~n 까지 스택에 push와 pop을 통해 문제에서 주어진 수열을 만드는 문제입니다.

  2. 1~n 까지 일단 push되어야합니다. i는 1부터 n까지 증가시킬 변수이고, num은 입력받는 수열 하나하나를 나타냅니다. 그리고 op는 push(‘+’)와 pop(‘-‘)이 순서대로 쌓입니다.

  3. 입력 받는 값 num이 i보다 크면 같아질 때까지 i를 증가시키며 스택에 push하고 마지막에 push한 값만 pop합니다.

  4. 입력 받는 값 num이 i보다 작다면 이미 스택 안에 숫자가 들어있거나 스택 안에 들어갔다가 pop이 되어 없어진 수입니다. 전자의 경우는 스택 수열을 만들 수 있고, 후자의 경우는 스택 수열을 만들 수 없습니다.

ex) 예제 1 : 4 - 3 - 6 - 8 - 7 - 5 - 2 - 1

num i op (string) st.top (stack)
4 1 + (push) 1
  2 + 2 / 1
  3 + 3 / 2 / 1
  4 + 4 / 3 / 2 / 1
       
3 5 - (pop) 3 / 2 / 1
    - 2 / 1
       
6   + 5 / 2 / 1
  6 + 6 / 5 / 2 / 1
  7 - 5 / 2 / 1
       
8   + 7 / 5 / 2 / 1
  8 + 8 / 7 / 5 / 2 / 1
  9 - 7 / 5 / 2 / 1
7   - 5 / 2 / 1
5   - 2 / 1
2   - 1
1   - Empty

ex) 예제 2 : 1 - 2 - 5 - 3 - 4

num i op (string) st.top (stack)
1 1 + (push) 1
1 2 - (pop) empty
       
2   + 2
  3 - empty
       
5   + 3
  4 + 4 / 3
  5 + 5 / 4 / 3
  6 - 4 / 3
       
3   - 3
    - empty
4 6   ??? -> NO

위의 예제 2번에서는 3을 출력하려는 와중에 4가 소실되었음을 알 수 있습니다. 즉, 3보다 4가 먼저 pop됨을 알 수 있습니다. 그래서 파란색 순서에서 소실 되는 것을 알 수 있기 때문에 num이 i보다 작고, num이 스택의 top보다 작은 경우에는 NO를 출력합니다.

3. 소스코드 (C++)

4. 소스코드 (Python)


터미널의 입출력 화면 예제1 입력

1874_1

터미널의 입출력 화면 예제1 출력

1874_2

터미널의 입출력 화면 예제2

1874_3 1874_4