λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
✨ Algorithm

[λ°±μ€€/C++] 18115번: μΉ΄λ“œ 놓기

by nitronium102 2022. 7. 24.

문제

μˆ˜ν˜„μ΄λŠ” μΉ΄λ“œ κΈ°μˆ μ„ μ—°μŠ΅ν•˜κ³  μžˆλ‹€. μˆ˜ν˜„μ΄μ˜ 손에 λ“€λ¦° μΉ΄λ“œλ₯Ό ν•˜λ‚˜μ”© 내렀놓아 λ°”λ‹₯에 μŒ“μœΌλ €κ³  ν•œλ‹€. μˆ˜ν˜„μ΄κ°€ μ“Έ 수 μžˆλŠ” κΈ°μˆ μ€ λ‹€μŒ 3가지닀.

  1. 제일 μœ„μ˜ μΉ΄λ“œ 1μž₯을 λ°”λ‹₯에 λ‚΄λ €λ†“λŠ”λ‹€.
  2. μœ„μ—μ„œ 두 번째 μΉ΄λ“œλ₯Ό λ°”λ‹₯에 λ‚΄λ €λ†“λŠ”λ‹€. μΉ΄λ“œκ°€ 2μž₯ 이상일 λ•Œλ§Œ μ“Έ 수 μžˆλ‹€.
  3. 제일 밑에 μžˆλŠ” μΉ΄λ“œλ₯Ό λ°”λ‹₯에 λ‚΄λ €λ†“λŠ”λ‹€. μΉ΄λ“œκ°€ 2μž₯ 이상일 λ•Œλ§Œ μ“Έ 수 μžˆλ‹€.

μˆ˜ν˜„μ΄λŠ” μ²˜μŒμ— μΉ΄λ“œ Nμž₯을 λ“€κ³  μžˆλ‹€. μΉ΄λ“œμ—λŠ” 1λΆ€ν„° NκΉŒμ§€μ˜ μ •μˆ˜κ°€ μ€‘λ³΅λ˜μ§€ μ•Šκ²Œ μ ν˜€ μžˆλ‹€. κΈ°μˆ μ„ N번 μ‚¬μš©ν•˜μ—¬ μΉ΄λ“œλ₯Ό λ‹€ λ‚΄λ €λ†“μ•˜μ„ λ•Œ, 놓여 μžˆλŠ” μΉ΄λ“œλ“€μ„ ν™•μΈν–ˆλ”λ‹ˆ μœ„μ—μ„œλΆ€ν„° μˆœμ„œλŒ€λ‘œ 1, 2, …, N이 μ ν˜€ μžˆμ—ˆλ‹€!

λ†€λž€ μˆ˜ν˜„μ΄λŠ” μ²˜μŒμ— μΉ΄λ“œκ°€ μ–΄λ–»κ²Œ λ°°μΉ˜λ˜μ–΄ μžˆμ—ˆλŠ”μ§€ κΆκΈˆν•΄μ‘Œλ‹€. 처음 μΉ΄λ“œμ˜ μƒνƒœλ₯Ό 좜λ ₯ν•˜μ—¬λΌ.

μž…λ ₯

첫 번째 μ€„μ—λŠ” N (1 ≤ N ≤ 106)이 주어진닀.

두 번째 μ€„μ—λŠ” 길이가 N인 μˆ˜μ—΄ Aκ°€ 주어진닀. Aiκ°€ x이면, i번째둜 μΉ΄λ“œλ₯Ό 내렀놓을 λ•Œ x번 κΈ°μˆ μ„ μΌλ‹€λŠ” λœ»μ΄λ‹€. AiλŠ” 1, 2, 3 쀑 ν•˜λ‚˜μ΄λ©°, An은 항상 1이닀.

좜λ ₯

초기 μΉ΄λ“œμ˜ μƒνƒœλ₯Ό μœ„μ—μ„œλΆ€ν„° μˆœμ„œλŒ€λ‘œ 좜λ ₯ν•˜μ—¬λΌ.

풀이

i번째둜 μΉ΄λ“œλ₯Ό λ‚΄λ €λ†“μ•˜μ„ λ•Œ <- 이 νŒŒνŠΈμ—μ„œ iκ°€ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— 0 λŒ€μ‹  1λΆ€ν„° μ‹œμž‘ν•˜λŠ” 것이 μ’‹λ‹€

#include <iostream>
#include <vector>
#include <deque>
#include <algorithm>
using namespace std;

/*
 * 1) 1번 기술 -> 제일 μœ„μ˜ μΉ΄λ“œ λ°”λ‹₯에 내렀놓기 -> 제일 μ•žμ— λΌμ›Œλ„£κΈ°
 * 2) 2번 기술 -> μœ„μ—μ„œ 두 번째 μΉ΄λ“œ λ°”λ‹₯에 내렀놓기 -> μ•žμ—μ„œ 두 λ²ˆμ§Έμ— λΌμ›Œλ„£κΈ°
 * 3) 3번 기술 -> 제일 밑에 μžˆλŠ” μΉ΄λ“œ 내렀놓기 -> 제일 뒀에 λΌμ›Œλ„£κΈ°
 * => μ•ž/λ’€ λΌμ›Œλ„£κΈ°κ°€ μžˆμœΌλ―€λ‘œ dequeλ₯Ό μ“΄λ‹€
 */
deque<int> cardGame(int n, vector<int> &card){
    deque<int> dq;

    for(int i=1; i<=n; i++){ //
        switch (card[i]) {
            case 1:
                dq.push_front(i);
                break;
            case 2:
            {
                int x = dq.front();
                dq.pop_front();
                dq.push_front(i);
                dq.push_front(x);
                break;
            }
            case 3:
                dq.push_back(i);
                break;
        }
    }
    return dq;
}

int main() {
    int n;
    cin >> n;

    // μž…λ ₯
    vector<int> card(n+1, 0);
    for (int i=1; i<=n; i++) // i번째둜 μΉ΄λ“œλ₯Ό λ‚΄λ €λ†“μ•˜μ„ λ•Œ card[i]번 κΈ°μˆ μ„ μ“΄λ‹€ -> 1λ²ˆμ§ΈλΆ€ν„° μ‹œμž‘ν•˜λ―€λ‘œ i=1
        cin >> card[i];

    // μ—°μ‚°
    reverse(card.begin()+1, card.end()); // 거꾸둜 μƒκ°ν•˜κΈ° λ•Œλ¬Έμ— reverse μ‚¬μš©
    deque<int> dq = cardGame(n, card);

    // 좜λ ₯
    while(!dq.empty()){
        cout << dq.front() << " ";
        dq.pop_front();
    }

}

λŒ“κΈ€