[백준] 1874 스택 수열
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. 기본적인 변수설정 및 수열을 입력받아 배열(arr)에 저장한다.
2. 스택에 넣어줄 변수(push)를 계속 증가시키면서 조건에 맞게 pop/push를 계속 진행한다.
2-1. 최대 배열 인덱스를 넘기고, 스택 수열의 최대 개수를 넘어갈 경우에는 종료한다.
2-2. 스택이 비어있거나, 스택의 top이 비교하는 수열 값과 다르면 push한다.
2-3. 스택이 비어있지 않은 상태에서 스택의 top과 비교하는 수열 값이 같으면 pop하고 다음 수열 값으로 지정해준다.(index++)
3. 스택에 비었을 경우에는 정상적인 스택 수열이며, 맨 마지막 \n 문자를 제외하고 결과를 출력한다.
3-1. 스택이 비지 않았을 경우에는 "NO"를 출력한다.
문제 및 입출력
예시
코드
import java.util.Scanner;
import java.util.Stack;
public class Main
{
public static void main(String[] args)
{
// 기본 객체 및 변수 설정
Scanner sc = new Scanner(System.in);
Stack<Integer> s = new Stack<Integer>();
StringBuilder sb = new StringBuilder();
int max = sc.nextInt();
int[] arr = new int[max];
int index = 0;
int push = 1;
// 수열값 설정
for(int i=0; i<max; i++)
{
arr[i] = sc.nextInt();
}
while(push<=max+1 && index<max)
{
// 스택이 비었을 때는 무조건 push하고 '+' 를 저장
if(s.isEmpty())
{
s.push(push);
sb.append("+");
sb.append("\n");
push++;
}
// 스택의 top과 수열의 값이 달랐을 때도 push하고 '+' 를 저장
if(s.peek()!=arr[index])
{
s.push(push);
sb.append("+");
sb.append("\n");
push++;
}
// 같으면 pop하고 '-' 를 저장
else
{
s.pop();
sb.append("-");
sb.append("\n");
index++;
}
}
// 맨 마지막 \n 문자를 제외하고 출력
if(s.isEmpty())
{
System.out.println(sb.toString().substring(0, sb.length()-1));
}
else
{
System.out.println("NO");
}
}
}