πŸ•οΈ 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;
}

/*
 */
λ°˜μ‘ν˜•