백준 1874
백준 1874 문제
import java.util.*;
public class Boj1874 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
Stack<Integer> stack = new Stack<>();
int num = 1;
boolean possible = true;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
for (int i = 0; i < arr.length; i++) {
int e = arr[i];
if (e >= num) {
while (e >= num) {
stack.push(num++);
sb.append("+\n");
}
stack.pop();
sb.append("-\n");
} else {
int t = stack.pop();
if (t != e) {
System.out.println("NO");
possible = false;
break;
} else {
sb.append("-\n");
}
}
}
if (possible) {
System.out.println(sb);
}
}
}
풀이
- 입력된 수열이 스택 구조에 맞는지 확인하는 문제이다.
- 수열의 개수를 입력받아
n 변수에 담는다.
- 수열을 담을 수 있는 배열을
n의 크기만큼 선언한다.
- 스택 구조에 맞는지 확인하기 위해 빈 스택을 생성한다.
- 오름차순으로 스택에 값을 넣기 때문에 초기값인
num을 1로 초기화한다.
- 스택의 구조에 올바른지 판단하는
possible 변수를 true로 선언한다.
- 스택에 값을
push()했는지 pop()을 했는지 기록을 담을 StringBuilder를 sb로 선언한다.
n번만큼 루프를 돌면서 수열을 arr 배열에 담는다.
- 수열을 차례대로 반복한다.
- 수열의 값을 꺼낸다.
- 수열에서 꺼낸 값이 현재의
num보다 크거나 같다면, num이 꺼낸 값보다 크거나 같아질 때까지 스택에 push()를 해주면서 num값을 1 증가시키고, sb에 +를 기록해준다.
num값이 수열에서 꺼낸 값과 같아졌다면, 스택에서 pop()을 해주고, sb에 -를 기록해준다.
- 수열에서 꺼낸 값이
num보다 작다면, 우선 스택에서 pop()을 하여 변수 t에 담는다.
- 수열에서 꺼낸 값과
t값이 다르다면, 스택의 구조에 어긋나기 떄문에 NO를 출력하고, possible를 false로 변환하고, break로 루프를 중단한다.
- 수열에서 꺼낸 값과
t값이 같다면, sb에 -를 기록한다.
- 수열을 정상적으로 반복을 완료했으면 스택의 구조에 알맞기 때문에 기록된
sb를 출력한다.