티스토리 뷰

#include <bits/stdc++.h>

using namespace std;

int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    deque<bool> deq;
    
    int q, rotate=0; //덱의 앞의 위치 3시 0 6시 1 9시 2 12시 3
    int ball=0, window=0; //공, 가림막 개수
    char c;
    
    cin >> q;
    
    char s[10] = {};
    while(q--) {
        cin >> s;
        if(s[2] == 's') { //push 뒤로 집어넣습니다.
            cin >> c;
            if(c == 'b') { //공
                ++ball;
                deq.emplace_back(true);
            }
            else { //가림막
                ++window;
                deq.emplace_back(false);
            }
        }
        else if(s[2] == 'u') { //count 개수를 셉니다.
            cin >> c;
            if(c == 'b') cout << ball << '\n';
            else cout << window << '\n';
        }
        else if(s[2] == 'p') { //가장 앞에 요소를 제거합니다.
            if(!deq.empty()) {
                if(deq.front()) --ball; //공
                else --window; //가림막
                deq.pop_front(); //덱에서 제거
            }
        }
        else if(s[2] == 't') { //rotate 회전시킵니다.
            cin >> c;
            if(c == 'l') { //반시계 방향
                --rotate;
                if(rotate < 0) rotate = 3;
            }
            else { //시계방향
                ++rotate;
                if(rotate > 3) rotate = 0;
            }
        }
        
        if(rotate == 1) { //만약 앞부분이 아래를 가리키고 있다면
            while (!deq.empty()) { //덱에 요소들이 있다면, 덱이 비워질 때까지 또는
                 if(!deq.front()) break; //가림막이 나타나기 전까지 제거합니다.
                  deq.pop_front();
                    --ball;
           }
        }
            
        if(rotate == 3) { //만약 뒷부분이 아래를 가리키고 있다면
            while (!deq.empty()) { //덱에 요소들이 있다면, 덱이 비워질 때까지 또는
                if(!deq.back()) break; //가림막이 나타나기 전까지 제거합니다.
             deq.pop_back();
               --ball;
           }
         }
    }
}

 

풀이 : 덱

 

1. 쿼리의 개수를 입력 받습니다.

2. bool 변수들을 담을 덱을 준비합니다. true는 공 이며, false는 가림막입니다.

3. push => 덱의 뒤로 삽입

    pop => 덱의 가장 앞의 요소를 제거

    count => 덱에 있는 공의 개수나, 가림막의 개수를 출력

주의 : count가 입력 될 때마다, 덱의 모든 요소들을 탐색해서 개수를 출력하는 것은 너무 오래걸리기에, 미리 변수를 준비해 둔다음 삽입하면 증가, 제거되면 1감소하도록 따로 만들어 놓습니다.

   rotate => 회전시킵니다. 위 코드에선 rotate라는 변수를 따로 만들어서 앞이 3시에 있다면 0, 6시는 1, 9시는 2, 12시는 3으로 두고, 명령이 떨어 질 때마다 값을 증가시키거나, 감소시켰습니다.

4. 만약 덱이 세로로 서있다면 (앞이 6시, 12시 방향을 가리키고 있음)

    앞이 아래 일 때는, 덱에 요소가 없게되거나, 가림막이 나오기 전까지 가장 앞에서 부터 공을 제거하며

    앞이 맨 위 (즉 뒤가 아래) 인 경우, 덱에 요소가 없게되거나, 가림막이 나오기 전까지 가장 뒤에서 부터 공을 제거합니다.

 

28078번: 중력 큐 (acmicpc.net)

 

28078번: 중력 큐

처음에 왼쪽이 큐의 뒤, 오른쪽이 큐의 앞인 가로 방향의 빈 큐가 존재한다. 이 큐에서 공이나 가림막을 하나씩 큐의 뒤에 삽입하거나, 큐의 가장 앞에 있는 공이나 가림막을 꺼낼 수 있으며, 큐

www.acmicpc.net

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함