๐Ÿ•๏ธ ICPC Sinchon/Linear Data Structure

[BOJ S3][C++] ๋ฐฑ์ค€ 18115๋ฒˆ : ์นด๋“œ ๋†“๊ธฐ

์„ ๋‹ฌ 2022. 9. 12. 22:04
๋ฐ˜์‘ํ˜•

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

 

18115๋ฒˆ: ์นด๋“œ ๋†“๊ธฐ

์ˆ˜ํ˜„์ด๋Š” ์นด๋“œ ๊ธฐ์ˆ ์„ ์—ฐ์Šตํ•˜๊ณ  ์žˆ๋‹ค. ์ˆ˜ํ˜„์ด์˜ ์†์— ๋“ค๋ฆฐ ์นด๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ๋‚ด๋ ค๋†“์•„ ๋ฐ”๋‹ฅ์— ์Œ“์œผ๋ ค๊ณ  ํ•œ๋‹ค. ์ˆ˜ํ˜„์ด๊ฐ€ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์€ ๋‹ค์Œ 3๊ฐ€์ง€๋‹ค. ์ œ์ผ ์œ„์˜ ์นด๋“œ 1์žฅ์„ ๋ฐ”๋‹ฅ์— ๋‚ด๋ ค๋†“๋Š”๋‹ค.

www.acmicpc.net

 

๋ฌธ์ œ

์ˆ˜ํ˜„์ด๋Š” ์นด๋“œ ๊ธฐ์ˆ ์„ ์—ฐ์Šตํ•˜๊ณ  ์žˆ๋‹ค. ์ˆ˜ํ˜„์ด์˜ ์†์— ๋“ค๋ฆฐ ์นด๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ๋‚ด๋ ค๋†“์•„ ๋ฐ”๋‹ฅ์— ์Œ“์œผ๋ ค๊ณ  ํ•œ๋‹ค. ์ˆ˜ํ˜„์ด๊ฐ€ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์€ ๋‹ค์Œ 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์ด๋‹ค.

์ถœ๋ ฅ

์ดˆ๊ธฐ ์นด๋“œ์˜ ์ƒํƒœ๋ฅผ ์œ„์—์„œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•˜์—ฌ๋ผ.

 

ํ’€์ด

๊ฒฐ๊ณผ ์นด๋“œ์ธ 1~n๊นŒ์ง€์˜ ์ˆ˜๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๊ฐ ๊ธฐ์ˆ ๋“ค์„ ๊ฑฐ๊พธ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค

  1. ์ œ์ผ ์œ„์˜ ์นด๋“œ 1์žฅ์„ ๋ฐ”๋‹ฅ์— ๋‚ด๋ ค๋†“๋Š”๋‹ค. -> ์นด๋“œ๋ฅผ ๋งจ ์œ„๋กœ ๋„ฃ๋Š”๋‹ค
  2. ์œ„์—์„œ ๋‘ ๋ฒˆ์งธ ์นด๋“œ๋ฅผ ๋ฐ”๋‹ฅ์— ๋‚ด๋ ค๋†“๋Š”๋‹ค. -> ์นด๋“œ๋ฅผ ์œ„์—์„œ ๋‘๋ฒˆ์งธ ์œ„์น˜๋กœ ๋„ฃ๋Š”๋‹ค
    -> ๋งจ ์œ„ ์นด๋“œ pop ์ˆ˜ํ–‰ํ›„ ํ•ด๋‹น ์นด๋“œ๋ฅผ pushํ•˜๊ณ  popํ–ˆ๋˜ ์นด๋“œ ๋‹ค์‹œ push
  3. ์ œ์ผ ๋ฐ‘์— ์žˆ๋Š” ์นด๋“œ๋ฅผ ๋ฐ”๋‹ฅ์— ๋‚ด๋ ค๋†“๋Š”๋‹ค. -> ์นด๋“œ๋ฅผ ์ œ์ผ ๋ฐ‘์œผ๋กœ ๋„ฃ๋Š”๋‹ค

์นด๋“œ๋ฅผ ์œ„์— ๋„ฃ์—ˆ๋‹ค๊ฐ€ ๋ฐ‘์— ๋„ฃ์—ˆ๋‹ค๊ฐ€ ๋ฐฉํ–ฅ์ด ์™”๋‹ค๊ฐ”๋‹ค ํ•˜๋ฏ€๋กœ ์–‘๋ฐฉํ–ฅ์ธ ๋ฑ์„ ์‚ฌ์šฉํ•ด๋ณด์ž

 

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <stack>
#include <deque>

using namespace std;
    
int main() {
    int n;
    cin >> n;
    stack<int> skills;
    for(int i=0; i<n; i++) {
        int input;
        cin >> input;
        skills.push(input);
    }
    deque<int> ans;
    
    for(int i=1; i<=n; i++){  // i๋ฒˆ์งธ ์ˆ˜ํ–‰๋•Œ๋Š” i๋ฒˆ ์นด๋“œ๋ฅผ ์›€์ง์ธ๋‹ค
        int skill = skills.top();
        skills.pop();  // ์Šคํ‚ฌ์„ ์ตœ๊ทผ๊ฒƒ๋ถ€ํ„ฐ ๊บผ๋‚ด์„œ ๊ฑฐ๊พธ๋กœ ์ˆ˜ํ–‰
        
        switch (skill) {
            case 1:  // ์ œ์ผ ์œ„์˜ ์นด๋“œ 1์žฅ์„ ๋ฐ”๋‹ฅ์— ๋‚ด๋ ค๋†“๋Š”๋‹ค. -> i ์นด๋“œ๋ฅผ ๋งจ ์œ„๋กœ ๋„ฃ๋Š”๋‹ค
                ans.push_front(i);
                break;
                
            case 2:  // ์œ„์—์„œ ๋‘ ๋ฒˆ์งธ ์นด๋“œ๋ฅผ ๋ฐ”๋‹ฅ์— ๋‚ด๋ ค๋†“๋Š”๋‹ค. -> i ์นด๋“œ๋ฅผ ์œ„์—์„œ ๋‘๋ฒˆ์งธ ์œ„์น˜๋กœ ๋„ฃ๋Š”๋‹ค
            {
                int top_card = ans.front();
                ans.pop_front();
                ans.push_front(i);
                ans.push_front(top_card);
                break;
            }
                
            case 3:  // ์ œ์ผ ๋ฐ‘์— ์žˆ๋Š” ์นด๋“œ๋ฅผ ๋ฐ”๋‹ฅ์— ๋‚ด๋ ค๋†“๋Š”๋‹ค. -> i ์นด๋“œ๋ฅผ ์ œ์ผ ๋ฐ‘์œผ๋กœ ๋„ฃ๋Š”๋‹ค
                ans.push_back(i);
                break;
        }
    }
    
    while(!ans.empty()){
        cout << ans.front() << " ";
        ans.pop_front();
    }
    
    return 0;
}

/*
 */

 

solutionํ•จ์ˆ˜ ๋ฒ„์ „ (ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค)

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <stack>
#include <deque>

using namespace std;

deque<int> solution(int n, stack<int> &skills) {
    deque<int> ans;
    
    for(int i=1; i<=n; i++){  // i๋ฒˆ์งธ ์ˆ˜ํ–‰๋•Œ๋Š” i๋ฒˆ ์นด๋“œ๋ฅผ ์›€์ง์ธ๋‹ค
        int skill = skills.top();
        skills.pop();  // ์Šคํ‚ฌ์„ ์ตœ๊ทผ๊ฒƒ๋ถ€ํ„ฐ ๊บผ๋‚ด์„œ ๊ฑฐ๊พธ๋กœ ์ˆ˜ํ–‰
        
        switch (skill) {
            case 1:  // ์ œ์ผ ์œ„์˜ ์นด๋“œ 1์žฅ์„ ๋ฐ”๋‹ฅ์— ๋‚ด๋ ค๋†“๋Š”๋‹ค. -> i ์นด๋“œ๋ฅผ ๋งจ ์œ„๋กœ ๋„ฃ๋Š”๋‹ค
                ans.push_front(i);
                break;
                
            case 2:  // ์œ„์—์„œ ๋‘ ๋ฒˆ์งธ ์นด๋“œ๋ฅผ ๋ฐ”๋‹ฅ์— ๋‚ด๋ ค๋†“๋Š”๋‹ค. -> i ์นด๋“œ๋ฅผ ์œ„์—์„œ ๋‘๋ฒˆ์งธ ์œ„์น˜๋กœ ๋„ฃ๋Š”๋‹ค
            {
                int top_card = ans.front();
                ans.pop_front();
                ans.push_front(i);
                ans.push_front(top_card);
                break;
            }
                
            case 3:  // ์ œ์ผ ๋ฐ‘์— ์žˆ๋Š” ์นด๋“œ๋ฅผ ๋ฐ”๋‹ฅ์— ๋‚ด๋ ค๋†“๋Š”๋‹ค. -> i ์นด๋“œ๋ฅผ ์ œ์ผ ๋ฐ‘์œผ๋กœ ๋„ฃ๋Š”๋‹ค
                ans.push_back(i);
                break;
        }
    }
    

    return ans;
}

int main() {
    int n;
    cin >> n;
    stack<int> skills;
    for(int i=0; i<n; i++) {
        int input;
        cin >> input;
        skills.push(input);
    }
    
    deque<int> ans = solution(n, skills);
    
    while(!ans.empty()){
        cout << ans.front() << " ";
        ans.pop_front();
    }
    
    return 0;
}

/*
 */
๋ฐ˜์‘ํ˜•