본문 바로가기

컴퓨터/백준 알고리즘

백준 알고리즘 - 12789번: 도키도키 간식드리미 [Java]

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

 

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

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

www.acmicpc.net

1. 코드

import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		Stack <Integer> take = new Stack<>();
		Stack <Integer> wait = new Stack<>();
		while(N-- > 0) {
			int num = sc.nextInt();
			if(num == take.size() + 1)
				take.push(num);
			else
				wait.push(num);
			
			while(!wait.isEmpty() && take.size() + 1 == wait.peek())
				take.push(wait.pop());
		}
		if(wait.isEmpty())
			System.out.println("Nice");
		else
			System.out.println("Sad");
	}
}

2. 설명

take는 간식을 받는 사람들의 명단이며 wait은 간식을 받기 위해 잠시 기다리는 사람들의 줄입니다. take에서는 1부터 N까지 순차적으로 저장이 되며 만약 순서가 엉킨다면 wait에서 기다리게 합니다. 만약 take 다음 순서가 wait의 peek 값이라면 pop 하여 take에 push 해줍니다.

이 모든 일련의 과정을 거치고 만약 wait이 비어 있다면 모든 사람들이 순서대로 간식을 받았기에 Nice를 출력하고 비어있지 않다면 순서대로 받지 못한 사람이 존재하기에 Sad를 출력합니다.

3. 정리

  1. 스택을 적절히 사용하자.