문제
1부터 n까지의 수를 스택에 넣었다가 뽑아 늘어놓음으로써, 하나의 수열을 만들 수 있다.
이때, 스택에 push하는 순서는 반드시 오름차순을 지키도록 한다고 하자.
임의의 수열이 주어졌을 때 스택을 이용해 그 수열을 만들 수 있는지 없는지, 있다면 어떤 순서로 push와 pop 연산을 수행해야 하는지를 알아낼 수 있다. 이를 계산하는 프로그램을 작성하시오
문제의 예시를 보면 "4 3 6 8 7 5 2 1" 가 주어지면 stack을 사용해서 해당 수열을 만들 수 있는지 구하는 것이다.
stack에는 오름차순으로 push를 해야하는 규칙이 있기 때문에 1, 2, 3, 4.. 순서로 push를 하고 4가 push 되었을때 pop을 2번 하면 4, 3이 나오게 되어서 문제의 예시대로 4, 3을 만들 수 있다.
먼저 입력을 받아서 기존의 배열과 오름차순으로 정렬이 된 배열을 만든다.
그리고 정렬이 된 배열에서 하나씩 push를 하다가 기존의 배열 순서에 맞는 숫자가 나오면 pop을 하는 식으로 구현하면 될 것 같다.
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
int[] sortedArr = new int[N];
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < N; i++) {
int value = Integer.parseInt(br.readLine());
arr[i] = value;
sortedArr[i] = value;
}
Arrays.sort(sortedArr);
int idx = 0;
for (int num : sortedArr) {
sb.append("+").append("\n");
stack.push(num);
while (!stack.isEmpty() && stack.peek() == arr[idx]) {
sb.append("-").append("\n");
stack.pop();
++idx;
}
}
if (!stack.isEmpty()) {
System.out.println("NO");
return;
}
System.out.println(sb);
'코딩테스트' 카테고리의 다른 글
[백준, 2164] 카드2 (0) | 2023.03.05 |
---|---|
[백준, 17298] 오큰수 (0) | 2023.03.05 |
[백준, 12891] DNA 비밀번호 (0) | 2023.03.05 |
[백준, 1940] 주몽의 명령 (0) | 2023.03.04 |
[백준, 2018] 수들의 합 (0) | 2023.03.04 |