문제설명

 

소스코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
	public static void main(String[] args) throws Exception
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		Stack<Integer> stack = new Stack<>();
		Queue<Integer> queue = new LinkedList<>();
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		for(int i = 0; i < N; ++i) queue.add(Integer.parseInt(st.nextToken()));
		int seq = 1;
		while(!queue.isEmpty()) //큐가 비어있지 않다면
		{
			if(queue.peek() == seq) //큐 맨앞과 순서가 맞다면
			{
				queue.poll(); //큐 맨앞 숫자를 제거
				++seq;
			}
			else if(!stack.isEmpty() && stack.lastElement() == seq) //스택 꼭대기와 순서가 맞다면
			{
				stack.pop(); //스택 꼭대기 숫자를 제거
				++seq;
			}
			else stack.push(queue.poll()); //스택 꼭대기와 순서가 다르다면, 큐 맨앞을 스택에 저장
		}
		while(!stack.isEmpty()) //스택이 비어있지 않다면
		{
			if(stack.lastElement() == seq) //스택 꼭대기와 순서가 맞다면
			{
				stack.pop(); //스택 꼭대기를 제거
				++seq;
			}
			else 
			{
				System.out.println("Sad");// 스택 꼭대기와 순서가 맞지 않다면 Sad
				System.exit(0);
			}
		}
		System.out.println("Nice");
	}
}

 

설명

  • 첫 번째 while문에서 큐의 맨 앞부분과, 스택의 꼭대기의 순서를 조사한다.
    순서가 맞다면 제거를 하고, 틀리다면 해당 큐를 스택에 넣는다.
    이런 반복을 큐가 empty상태가 될 때 까지 반복한다.
  • 두 번째 while문에서 스택의 꼭대기와 순서를 조사한다.
    순서가 맞다면 스택 꼭대기를 제거하고, 틀리다면 Sad를 출력한다.