스택 수열
27 June 2019
문제 : https://www.acmicpc.net/problem/1874
이번은 스택을 이용해 수열을 만드는 문제를 풀어보도록 하겠습니다.
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
Stack stack = new Stack(100000);
int size = sc.nextInt();
String ret = solve(sc, stack, size);
System.out.println(ret);
}
private static String solve(Scanner sc, Stack stack, int size) {
StringBuilder builder = new StringBuilder();
int stackVal = 0;
for (int i = 0; i < size; i++) {
int val = sc.nextInt();
while (true) {
if (stack.isEmpty()) {
stackVal++;
stack.push(stackVal);
builder.append("+" + "\n");
} else {
if (stack.peek() < val) {
stackVal++;
stack.push(stackVal);
builder.append("+" + "\n");
} else if (stack.peek() == val) {
stack.pop();
builder.append("-" + "\n");
break;
} else {
return "NO";
}
}
}
}
return builder.toString();
}
}
class Stack {
private int top = -1;
private int[] queue;
Stack(int max) {
queue = new int[max];
}
void init() {
this.top = -1;
}
void push(int val) {
top++;
queue[top] = val;
}
int pop() {
if (top == -1) {
return -1;
}
int val = queue[top];
top--;
return val;
}
int peek() {
if (isEmpty()) {
return -1;
} else {
return queue[top];
}
}
boolean isEmpty() {
return top == -1;
}
}
먼저 문제에 대한 설명을 추가하도록 하겠습니다.어떤 하나의 수열이 주어졌을 때, stack에 1부터 차례대로 값을 넣으면서 해당 수열과 같은 값을 순서에 맞게 pop을 수행할 수 있는가 하는 문제입니다.
예를 들면, 4를 만들려면 1,2,3,4를 차례대로 push하고 pop을 수행하면 가능하고, 이어서 또 pop을 하면 3을 얻을 수 있게 됩니다.
위와 같은 형식으로 그대로 logic을 만들어주면 위 문제를 푸는 것이 가능합니다.
1부터 차례대로 값을 push하는데, stack이 비어있을 경우는 값을 넣고, 비어있지 않을 경우는 현재 stack의 top의 값이 수열의 값보다 작을 경우는 1만큼 큰 값을 push,같은 경우는 pop, 큰 경우는 해당 값을 얻을 방법이 없기 때문에 "NO"를 출력해주도록 합니다.