알고리즘/시뮬레이션 & 구현

[백준/구현/C++] 20055번 컨베이어 벨트 위의 로봇

데메즈 2023. 3. 29. 18:15
728x90
반응형

문제는 여기!

#include <bits/stdc++.h>

using namespace std;

int N, K;
int A[201];
int IN, OUT;
bool hasRobot[201];
int level = 0;
queue<int> robot;

void rotateBelt(){
    IN -= 1;
    OUT -= 1;
    if(IN == 0) IN = 2*N;
    if(OUT == 0) OUT = 2*N;
}

bool checkNaegu(){
    int cnt = 0;
    for(int i=1; i<=2*N; i++){
        if(A[i]==0) cnt++;
    }

    if(cnt >= K) return false;
    else return true;
}

void solve(){

    while(1){
        level++;
        // 벨트 회전
        rotateBelt();
        // 로봇 이동
        int size = robot.size();
        for(int i=0; i<size; i++){
            int front = robot.front();
            int next;
            robot.pop();

            if(front == 2*N) next = 1;
            else next = front + 1;

            if(front == OUT){
                hasRobot[front] = false;
            } else if(A[next]>0 && !hasRobot[next]){
                hasRobot[front] = false;
                A[next] -= 1;

                // 내구도 0인 칸이 K개 이상이면 return
                if(!checkNaegu()) return;
                // 다음이 OUT이 아닌경우 로봇올리기
                if(next != OUT) {
                    hasRobot[next] = true;
                    robot.push(next);
                }
            } else {
                robot.push(front);
            }
        }
        // 로봇 올리기
        if(A[IN]>0 && !hasRobot[IN]){
            hasRobot[IN] = true;
            A[IN] -= 1;
            robot.push(IN);
        }
        // 내구도 0인 칸이 K개 이상이면 return
        if(!checkNaegu()) return;
    }

}

void input(){
    cin >> N >> K;
    for(int i=1; i<=2*N; i++){
        cin >> A[i];
    }
    IN = 1; OUT = N;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    input();
    solve();
    cout << level;

    return 0;
}
728x90
반응형