문제풀이(Problem Solving)

백준, BOJ, 20055번, 컨베이어 벨트 위의 로봇 : C++ [CPP]

게임이 더 좋아 2021. 12. 8. 19:52
반응형
728x170

그냥 시키는 대로 하면 된다.

다만 빼먹으면 안된다.

모든 조건을 빼먹으면 안된다.

 

 

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

 


 

#맞는 풀이

#include <iostream>
#include <deque>

#define X first
#define Y second

using namespace std;
using ll = long long;

int N, K; // 칸과 제한

deque <pair<int, int>> deq;   // 로봇이 있는지 1,0  내구도 int


int main() {
    cin >> N >> K;
    int num = 2 * N;
    while (num--) {
        int x;
        cin >> x;
        deq.push_back({0,x }); //로봇이 없는 채로 deq 초기화
    }
    int stage = 0;

    while (1) {
        stage++;//스테이지 시작

        //1번 작업 -> 한 칸 밀기.
        auto back = deq.back();
        deq.pop_back();
        deq.push_front(back);

        //밀었을 때 로봇이 내리는 위치에 있으면 당장내림
        if (deq[N - 1].first == 1) {
            deq[N - 1].first = 0;
        }
        //2번 작업 -> 가장 앞에 있는 로봇부터 (N-1은 이미 내려감)
        for (int i = N - 2; i >= 0; i--) {
            //i번째 칸에 로봇이 있고 i+1 칸의 내구도가 1 이상이고 로봇이 없으면
            if (deq[i].first == 1 && deq[i + 1].second >= 1 && deq[i + 1].first == 0) {
                deq[i].first = 0; //현재 칸에서 로봇이 사라지며
                deq[i + 1].first = 1; //다음 칸으로 이동
                deq[i + 1].second -= 1; //다음 칸의 내구도 -1
            }
        }

        //로봇이 움직였을 때 로봇이 내리는 위치에 있으면 당장내림
        if (deq[N - 1].first == 1) {
            deq[N - 1].first = 0;
        }

        //3번 작업 -> 올리는 칸의 내구도가 0이 아니면 올림
        if (deq[0].second != 0) {
            deq[0].first = 1;
            deq[0].second -= 1; //내구도 1감소
        }

        //4번 작업 -> 모든 칸에 대한 내구도 0인 개수 조사
        int cnt = 0;
        for (int i = 0; i < 2 * N; i++) {
            if (deq[i].second == 0) { cnt++; }
        }
        if (cnt >= K) {
            break;
        }

        
    }
    cout << stage;
    


    return 0;
}

 

왠지 원형 큐 같긴래 deq을 이용했더니 정말 쉬웠다.

점점 감이 오는 건가..?

자만하지 말고 해보자

728x90
반응형
그리드형