- 이 문제는 1부터 n사이의 정수 수열이 주어졌을 때, 그 수열을 1부터 n까지 차례로
스택에 push, pop함으로서 만들수 있는지를 검증하는 문제이다.
예를 들면,
4 3 6 8 7 5 2 1 인 수열이 주어졌을 때,
- 4를 꺼내야 하므로 1~4까지 스택에 push -> [1,2,3,4]
- 4를 바로꺼내 수열에 넣을 수 있으므로 pop -> 스택: [1,2,3] / 수열: [4]
- 스택의 마지막 수가 3이므로 pop -> 스택: [1,2] / 수열: [4,3]
- 6을 꺼내야 하므로 5~6까지 스택에 push -> [1,2,5,6]
- 6을 바로 꺼내 수열에 넣을 수 있으므로 pop -> 스택: [1,2,5] / 수열: [4,3,6]
- 8을 꺼내야 하므로 7~8까지 스택에 push -> [1,2,5,7,8]
- 8를 바로 꺼내 수열에 넣을 수 있으므로 pop -> 스택: [1,2,5,7] / 수열: [4,3,6,8]
- 7을 바로 꺼내 수열에 넣을 수 있으므로 pop -> 스택: [1,2,5] / 수열: [4,3,6,8,7]
- 5을 바로 꺼내 수열에 넣을 수 있으므로 pop -> 스택: [1,2] / 수열: [4,3,6,8,7,5]
- 2을 바로 꺼내 수열에 넣을 수 있으므로 pop -> 스택: [1] / 수열: [4,3,6,8,7,2]
- 1을 바로 꺼내 수열에 넣을 수 있으므로 pop -> 스택: [] / 수열: [4,3,6,8,7] -> 완성!
요약하면,
먼저 수열에 들어가야 하는 수가 현재 스택에 없다면 스택에 작은 수 부터 넣고 pop을
해주면 되고,
수열에 들어가야 하는 수가 현재 스택에 있다면 현재 꺼낼 수 있는지를 검사하고
꺼낼 수 있다면 꺼내고, 꺼낼 수 없다면 실패이다(그 수를 꺼내려면 먼저 현재 꺼낼 수 있는 수를 꺼내야 하는데, 그렇게 되면 수열의 순서가 망가지게 된다).
public class Q1874 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
Stack<Integer> stack = new Stack<>();
int N = Integer.parseInt(br.readLine());
int index = 0;
for (int i = 0; i < N; i++) {
int num = Integer.parseInt(br.readLine());
if (index < num) {
for (int j = index+1; j <= num; j++) {
stack.push(j);
sb.append("+\n");
}
index = num;
} else if (stack.peek() != num) {
System.out.println("No");
}
stack.pop();
sb.append("-\n");
}
System.out.println(sb);
}
}