IT/알고리즘
[백준] 1874번 스택수열
So1_b
2024. 4. 18. 16:54
https://www.acmicpc.net/problem/1874
1874번: 스택 수열
1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.
www.acmicpc.net
1) 스택의 peek가 비교항(s)과 같아 질 수 있는지를 중심으로 판단
peek == s (o)
peek > s : 절대 같아질 수 없음
peek < s : max > s이면 같아질 수 없고, max < s 이면 같아질 수 있음
2) 1 ~ n 까지 모두 넣어야 하고 스택에서 pop연산을 수행하는 순간 만들고자하는 수열에 값이 추가됨.
3) 메모리 128MB 이하
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
// 1. n 입력받기
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
// 1-1. 변수 초기화
StringBuilder sb = new StringBuilder();
String result ="";
Stack<Integer> stack = new Stack<Integer>();
int max = 0; // 스택에 넣은 최댓값
int peek = 0; // 스택 최상단 값
// 2. 수열 만들기
while(n-- > 0) {
int s = scan.nextInt();
if(s == peek) {
stack.pop(); sb.append("-\n");
}else if(s > peek && s > max) { // stack이 비어있지 않음
while(max != s) {
stack.push(++max); sb.append("+\n");
}
stack.pop(); sb.append("-\n");
}else { // s > peek, s >= max or s < peek, s > max
result = "NO";
break;
}
if(stack.empty())
peek = 0;
else
peek = stack.peek();
}
scan.close();
if(!result.equals("NO"))
result = sb.toString().substring(0, sb.length());
// 3. 출력
System.out.println(result);
}//main
}