import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = sc.nextInt();
}
// 입력값 모두 변수로 바꿔줌
Stack<Integer>[] stacks = new Stack[4];
for (int i = 0; i < 4; i++) {
stacks[i] = new Stack<>();
stacks[i].push(0);
}
// 만들어야 하는 4개의 스택을 stacks라는 배열로 만들어 준다.
다만 만들어둔 스택이 아무 값도 안들어 있을수 있으니 0이라는 값을 넣어준다.
emptyStack오류를 방지해준다 --> 실제로 이 오류때문에 많이 헤맸다
boolean result = true;
// 청소 가능여부를 판별해준 boolean형식의 result 변수를 만든다.
for (int i : arr) {
boolean inStack = false;
// 일단 stacks에 arr배열값을 넣어도 될지 여부는 false로 초기화해준다.
for (int j = 0; j < 4; j++) {
if (i > stacks[j].peek()) {
stacks[j].push(i);
inStack = true;
break;
}
}
// for문을 돌면서 만약 arr의 i 원소가 stacks[j]의 stack.peek값(가장 위의 값)보다 크다면
해당 stacks에 i원소를 더한다. 그리고 false로 초기화 해준 inStack의 값을 true로 바꾼다.
if (!inStack){
result = false;
break;
}
// 만약 inStack이 불가하다면, result(청소 가능여부) 는 false로 바뀐다.
}
System.out.println(result ? "YES" : "NO");
// result가 true라면 YES를, false라면 NO를 반환해준다.
}
}
<br><br>
👍 내생각
우선 해당 문제는 내가 혼자 힘으로 코드를 짤 수 없을거 같아서 어떻게 구현할지 생각만 해보고 구글링을 통해 해결했다.
내가 생각한 부분은,
① 입력값을 배열로 만들자
② 청소가능 여부를 판단해줄 boolean 변수를 만들자
③ for문으로 입력값 배열을 돌면서, stack의 가장 마지막 값이 입력값 원소보다 작은지 판단하자
요 3가지 정도였고,
4가지 스택을 for문을 통해 배열로 만든 부분은 생각해내지 못했다.
스택을 4개로 모두 stack1, stack2, stack3, stack4로 만들어서 코드를 짜보려고 했는데, 각 스택의 peek를 비교하는 부분에서 for문이 적용되지 않아서 막혔다.
<br><br>
🤔배운내용
1. for문으로 stacks 배열을 만들어서 각 stack을 배열에 넣는 구현법
2. stack에 들어갈 수 있는지 여부와 청소 가능 여부는 각기 다른 boolean변수를 가지고 있어야 한다.
3. result의 true, false값에 따라 출력값을 다르게 설정한 부분
4. stack 개념