[ 백준 ] 12789 / 도키도키 간식드리미

金弘均·2021년 9월 14일
0

Baekjoon Online Judge

목록 보기
17/228
post-thumbnail

# Appreciation

/*
 * Problem :: 12789 / 도키도키 간식드리미
 *
 * Kind :: Data Structure
 *
 * Insight
 * - 문제설명에서 주어진 그림부터
 *   "스택을 사용해!" 라고 말하고 있다
 *   + 한 명씩만 설 수 있는 공간 => 스택
 *     현재 줄 서있는 곳 => 큐
 *     로 다루어주자
 *
 * - 생각해보면 스택에는 학생들의 번호표가 top 부터
 *   오름차순으로 정렬되어 있어야 한다
 *   + 제일 왼쪽을 top 이라고 하고 [4, 3, 5] 로 서있다면
 *     4번은 3번이 받기 전까지 간식을 받을 수 없으므로
 *     이들은 절대로 간식을 받을 수 없다
 *     # 큐의 front 부터 차례대로 학생들을 볼 때
 *       1번 부터 간식을 받을 수 있으면 받지만
 *       지금당장 간식을 받을 수 없다면 스택에 넣어지게 되는데
 *       이 순서가 오름차순이 아닐 경우 간식을 받을 수 없다
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <stack>
#include <queue>

using namespace std;

#define endl '\n'

// Set up : Global Variables
/* None */

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int N; cin >> N;
    queue<int> que; /* Queue = 현재 줄 서 있는 곳 */
    for (int i=0; i<N; i++) {
        int no; cin >> no;
        que.push(no);
    }

    // Process
    stack<int> st; /* Stack = 한 명씩만 설 수 있는 공간 */

    int c = 1; /* 현재 간식을 받을 수 있는 번호 */
    bool isPossible = true;
    while (not(que.empty()) || not(st.empty())) {
        int f = (que.empty()) ? -1 : que.front(); /* que 의 front, 비어있으면 -1 */
        int t = (st.empty()) ? -1 : st.top(); /* st 의 top, 비어있으면 -1 */

        /* Queue 맨 앞의 학생이 간식을 받을 수 있다면 */
        if (f > 0 && f == c) {
            que.pop();
            c++;
            continue;
        }

        /* Stack 맨 위의 학생이 간식을 받을 수 있다면 */
        if (t > 0 && t == c) {
            st.pop();
            c++;
            continue;
        }

        /* Queue 맨 앞의 학생이 간식을 받을 수 없다면 */
        if (f > 0 && f != c) {
            /* Stack 맨 위의 학생의 번호가
             * Queue 맨 앞의 학생의 번호보다 낮다면 */
            if (t > 0 && t < f) {
                isPossible = false; /* 모두 간식받기는 불가능 */
                break;
            }
            /* Stack 맨 위의 학생의 번호가
             * Queue 맨 앞의 학생의 번호보다 높다면 */
            st.push(f);
            que.pop();
        }
    }

    // Control : Output
    cout << ((isPossible) ? "Nice" : "Sad") << endl;
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이

0개의 댓글