백준

백준[12789]번 : 도키도키 간식드리미 ( JAVA )

하루우울루 2023. 8. 11. 14:09

https://www.acmicpc.net/problem/12789

 

12789번: 도키도키 간식드리미

인하대학교 학생회에서는 중간, 기말고사 때마다 시험 공부에 지친 학우들을 위해 간식을 나눠주는 간식 드리미 행사를 실시한다. 승환이는 시험 기간이 될 때마다 간식을 받을 생각에 두근두

www.acmicpc.net


Code

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
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 IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		Queue<Integer> queue = new LinkedList<Integer>(); // 현재 줄 서있는 공간
		Stack<Integer> stack = new Stack<Integer>(); // 한명 씩만 설 수 있는 공간
		
		int t = Integer.parseInt(br.readLine());
		int count = 1;
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		while(st.hasMoreTokens()) {
			int x = Integer.parseInt(st.nextToken());
			
			queue.add(x);
		}
		
		while(!queue.isEmpty()) { // 현재 줄이 없을 때까지
			if(queue.peek() == count || !stack.isEmpty() && stack.peek() == count) { // 현재 줄과 한 명만 설 수 있는 공간 체크
				if(queue.peek() == count)
				{
					queue.poll();
					count++;
				}
				else {
					stack.pop();
					count++;
				}
			}
			else { // 한 줄로 설 수 있는 공간에 넣기
				stack.add(queue.peek());
				queue.poll();
			}
		}
		
		while(!stack.isEmpty()) {
			if(stack.peek() == count) {
				stack.pop();
				count++;
			}
			else {
				bw.write("Sad");
				br.close();
				bw.close();
				return;
			}
		}
		
		bw.write("Nice");
		
		br.close();
		bw.close();
		
	}
	
}

처음엔 문제를 잘 못 이해하고 엄청 틀렸다.

 

큐와 스택의 peek 위치와 제거되는 위치를 잘 알아야겠다.