코테연습일지/구현 (시뮬레이션)

20055 컨베이어 벨트 위의 로봇

jemin0619 2024. 3. 6. 00:26

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

 

20055번: 컨베이어 벨트 위의 로봇

길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부

www.acmicpc.net

 

단순한 구현 문제인데, 원문이 영어인건지 지문이 좀 이상하게 느껴졌다.

https://github.com/encrypted-def/basic-algo-lecture/blob/master/0x0D/solutions/20055.cpp

 

#include <bits/stdc++.h>
using namespace std;

int n,k,brokenCnt,ans;
int arr[203]; //내구도는 돌아야하므로 203까지 만듦
int is_bot[103]; //로봇은 출구에서 바로 내리므로 200번 배열까지 가지 않음

void rot(){
    rotate(arr,arr+2*n -1,arr+2*n); //오른쪽으로 한 칸 회전
    rotate(is_bot,is_bot+n-1,is_bot+n); //마찬가지로 회전
    is_bot[n-1]=0; //로봇이 출구에 있을 수 있으므로 내려줌
}

void move(){
    for(int cur=n-2;cur>0;cur--){ //0-indexed이므로 마지막 값 이전 값을 cur로 함
        int nxt=cur+1; //첫 번째 loop에서 마지막 값이 nxt
        if(arr[nxt]==0 || !is_bot[cur] || is_bot[nxt]) continue;
        if(--arr[nxt]==0) brokenCnt++;
        is_bot[cur]=0; is_bot[nxt]=1;
        is_bot[n-1]=0; //이거 빼면 TC 4에서 WA
    }
}

void put_robot(){
    if(arr[0]==0) return;
    if(--arr[0]==0) brokenCnt++;
    is_bot[0]=1;
}

int main(){
    ios::sync_with_stdio(0); cin.tie(0);
    cin>>n>>k;
    for(int i=0;i<n*2;i++) cin>>arr[i];
    while(++ans){
        rot();
        move();
        put_robot();
        if(brokenCnt>=k) break;
    }
    cout<<ans;
    return 0;
}