알고리즘/백준
1874번 스택 수열(java)
MoonjuLee
2024. 11. 15. 13:10
이 문제를 처음 접하면 저처럼 예제 출력이 왜 이렇게 출력되는지 몰라 조금 해맬 수 있다고 생각해 한 번 살펴보도록 하겠습니다.
예제 이해
해당 문제에서 가장 중요한 문구는 '임의의 수열이 주어졌을 때 스택을 이용해 그 수열을 만들 수 있는지 없는지, 있다면 어떤 순서로 연산을 수행해야 하는지' 라고 생각합니다.
예제 입력 1을 보면 8개의 숫자를 입력받고 4를 만드려면 push(1), push(2) , push(3) , push(4) 하고 pop()을 수행해야 합니다. 생각을 조금 더 해보자면 아래와 같이 예제가 출력된다는 것을 알 수 있습니다.
+ 1
+ 2
+ 3
+ 4
- 4
- 3
+ 5
+ 6
- 6
+ 7
+ 8
- 8
- 7
- 5
- 2
- 1
-인 pop()을 한 숫자를 나열해보면 예제 출력 1 처럼 출력된다는 것을 알 수 있습니다.(4 3 6 8 7 5 2 1)
예제 입력 2를 아래와 같이 보면 수열이 만들어지지 않는 경우를 알 수 있습니다.
+ 1
- 1
+ 2
- 2
+ 3
+ 4
+ 5
- 5
- 4
- 3 -> 찾기 위해 4를 pop() 해버림... 그 결과는 4를 찾지 못해 아래와 같습니다.
NO
구현 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
Stack<Integer> stack = new Stack<>();
int j = 1;
boolean flag = true;
for (int i = 0; i < n; i++){
int k = Integer.parseInt(br.readLine());
if (j <= k){
for (; j <= k; j++){
stack.push(j);
sb.append("+\n");
}
}else {
if (stack.peek() != k){
flag = false;
}
}
stack.pop();
sb.append("-\n");
}
if (flag){
System.out.print(sb);
}else {
System.out.print("NO");
}
br.close();
}
}
코드 설명
Stack을 만들고 전역 변수로 선언된 j 값과 현재 입력된 수(k)의 대소 관계 중 j가 k와 작거나 같을 경우 증가하는 j의 값을 Stack에 push()를 하고 StringBuulder에 +를 append() 해줍니다. 이후 수열을 만들기 위해 맨 위의 값을 pop() 해주고 마찬가지로 -를 append() 해줍니다.
j가 k와 작거나 같을 경우 이외에는 Stack의 맨 위 값을 peek() 하여 k의 값과 다르다면 NO를 출력하도록 코드를 구현했습니다.