백준 1874. 스택수열 (자바 & 파이썬)

WooHyeong·2023년 5월 22일
1

Algorithm

목록 보기
26/41

문제 : 백준1874. 스택수열

문제

1부터 n까지의 수를 넣었다가 뽑아 늘어놓음으로써, 하나의 수열을 만들 수 있다. 이때, 스택에 push하는 순서는 반드시 오름차순을 지키도록 한다고 하자. 임의의 수열이 주어졌을 때 스택을 이용해 그 수열을 만들 수 있는지 없는지, 있다면 어떤 순서로 push와 pop연산을 수행해야 하는지를 알아낼 수 있다. 이를 계산하는 프로그램을 작성하라.

입력

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

출력

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

풀이

우선 문제를 보고 무슨 소리를 하는건가 이해하는데 애먹었다.
1부터 n까지의 수를 스택에 집어넣는데, 쭉 push하는것이 아닌 stack에서 pop을 해서 나열한 숫자가 입력된 수열과 같아야 한다.

아! 뭔말이에요

ex) n= 4
3
4
2
1

입력이 위와 같이 주어졌을때, n이 4이므로 스택에 push할 수 있는 수는 1~4까지다.
수열의 첫번째 수가 3이다. 그러므로 스택에서 처음으로 출력해야하는 수는 3이다. 스택에서 3을 출력하려면 어떻게 해야할까?
우선 1부터 3까지를 stack에 push한다.
그리고 stack의 top이 3이면 출력하는 것이다.
수열의 다음 수는 4이므로 4까지 스택에 push하고 pop한 수가 4이면 우리는 3 4 까지는 만족시키게 되는 것이다. 뒤부터는 각자 생각해보기로 한다.

풀이 코드 python
n = int(input())
result = []
stack = []
idx = 1
state = True

for i in range(n):
    k = int(input())

    while idx <= k:
        stack.append(idx)
        idx += 1
        result.append("+")
    # for j in range(idx, k+1):
    #     stack.append(j)
    #     result += "+\n"
    #     idx += 1
    if stack[-1] == k:
        stack.pop()
        result.append("-")
    else:
        state = False
        break

if state:
    for i in result:
        print(i)
else:
    print("NO")
풀이 코드 java
import java.io.*;
import java.util.Stack;

public class boj1874 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int n = Integer.parseInt(br.readLine());

        int start = 1;
        Stack<Integer> stack = new Stack<>();

        for (int i = 0; i < n; i++) {
            int cur = Integer.parseInt(br.readLine());

            for (int j = start; j <= cur; j++) {
                stack.push(j);
                sb.append("+\n");
                start = j + 1;

            }

            if (stack.peek() == cur) {
                stack.pop();
                sb.append("-\n");
            }

            else {
                sb = new StringBuilder();
                sb.append("NO");
                break;
            }

        }

        System.out.println(sb.toString());

    }
}
profile
화이링~!

0개의 댓글