[Algorithm/Java] 백준 1874번 - 스택 수열
https://www.acmicpc.net/problem/번호
📌 문제
문제 유형
- 자료구조
- 스택
문제 설명
1부터 n까지의 수를 스택에 넣었다가 뽑아 늘어놓음으로써, 하나의 수열을 만들 수 있다.
이때, 스택에 push하는 순서는 반드시 오름차순을 지키도록 한다고 하자.
임의의 수열이 주어졌을 때 스택을 이용해 그 수열을 만들 수 있는지 없는지, 있다면 어떤 순서로 push와 pop 연산을 수행해야 하는지를 알아낼 수 있다.
이를 계산하는 프로그램을 작성하라.
입출력 예시
입력
첫 줄에 n (1 ≤ n ≤ 100,000)이 주어진다. 둘째 줄부터 n개의 줄에는 수열을 이루는 1이상 n이하의 정수가 하나씩 순서대로 주어진다. 물론 같은 정수가 두 번 나오는 일은 없다.
8
4
3
6
8
7
5
2
1
출력
입력된 수열을 만들기 위해 필요한 연산을 한 줄에 한 개씩 출력한다. push연산은 +로, pop 연산은 -로 표현하도록 한다. 불가능한 경우 NO를 출력한다.
+
+
+
+
-
-
+
+
-
+
+
-
-
-
-
-
🔍 문제 풀이
목표 숫자(입력받은수) x를 제외한 나머지 숫자들은 스택에 남겨두고, 목표 숫자만 pop하여 수열을 만드는 방식
- 스택에는 오름차순으로만 수를 넣을 수 있기 때문에, 현재 스택에 들어간 숫자까지를 관리하는
nextNum
변수를 만든다. (초기값 1) - 수열의 목표 숫자
x
를 입력받을 때마다,nextNum
부터x
까지 push하며 스택을 채운다. - 목표 숫자
x
가 스택의 top에 있다면 pop해서 수열을 만들 수 있다. - 스택의 top과
x
가 다르면 원하는 수열을 만들 수 없으므로 “NO” 출력 후 종료한다.
예시
입력:
4 6
① 목표 숫자 4:
1, 2, 3, 4
를 스택에 넣고+
연산을 기록stack = [1, 2, 3, 4]
stack.peek() == 4
이므로, 4를 pop하고 - 연산을 기록 →stack = [1, 2, 3]
② 목표 숫자 6:
5
와6
을 스택에 넣고+
연산을 기록stack = [1, 2, 3, 5, 6]
stack.peek() == 6
이므로, 6을 pop하고 - 연산을 기록 →stack = [1, 2, 3, 5]
최종 출력:
+
+
+
+
-
+
+
-
💻 전체 코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
List<Character> list = new ArrayList<>();
Deque<Integer> stack = new ArrayDeque<>();
int nextNum = 1;
for (int i = 0; i < n; i++) {
int x = Integer.parseInt(br.readLine());
// x에 도달할 때까지 스택에 숫자 push
while (nextNum <= x) {
stack.push(nextNum++);
list.add('+');
}
// 스택 top이 x이면 pop (수열에 사용)
if (stack.peek() == x) {
stack.pop();
list.add('-');
} else {
// x를 만들 수 없으면 실패
System.out.println("NO");
return;
}
}
for (char c : list) {
System.out.println(c);
}
}
}
댓글남기기