코테연습일지/구현 (시뮬레이션)
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;
}