[C++]백준20055번 컨베이어 벨트 위의 로봇
문제는 다음과 같다.
오늘은 백준20055번 컨베이어 벨트 위의 로봇 문제를 풀어보도록 하자. 처음에 문제이해를 못했다. 지문이 좀 이상한 듯..?해서 질문을 보고 이해했다. 로봇은 Index = 0에서 입장 할 수 있고, Index = N - 1에서 퇴장한다.
그리고 다음과 같은 로직을 따라 계속 움직인다.
-
벨트가 각 칸 위에 있는 로봇들과 함께 한 칸 회전한다. 내리는 위치에 있는 로봇은 내린다.
-
가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다. 로봇이 이동하기 위해서는 로봇이 내리는 위치가 아니고, 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
-
올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
-
내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.
질문을 이해하는데 백준의 djm03178님의 도움을 받았습니다. 감사합니다.
위 로직대로 설계만하면 되는 문제였다. 컨베이어 벨트를 구현하고 push,pop,각각의 원소 값을 체크하려 deque컨테이너를 선택했으며 로봇의 유무는 struct info의 robot으로 true, false로 체크해주었다.
[코드]
#include <iostream>
#include <deque>
using namespace std;
struct info {
int box_cnt;
bool robot;
};
deque<info>dQ;
int N, K, stage = 1, K_temp = 0;
bool Robot_Finish() {
K_temp = 0;
for (int i = 0; i < dQ.size(); i++) {
if (dQ[i].box_cnt == 0) {
K_temp++;
}
}
if (K_temp >= K) {
return true;
}
return false;
}
void Robot_Setting() {
if (dQ[0].box_cnt > 0) {
dQ[0].robot = true;
dQ[0].box_cnt -= 1;
}
}
void Robot_Check() {
for (int i = N - 2; i >= 0; i--) {
if (dQ[i].robot && !dQ[i + 1].robot && dQ[i + 1].box_cnt >= 1) {
dQ[i + 1].box_cnt -= 1;
dQ[i].robot = false;
dQ[i + 1].robot = true;
if (i == N - 2) {
dQ[i + 1].robot = false;
}
}
}
}
void Robot_Move() {
int temp_cnt = dQ[dQ.size() - 1].box_cnt;
dQ.pop_back();
dQ.push_front({ temp_cnt,false });
dQ[N - 1].robot = false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> N >> K;
int box_info;
for (int i = 0; i < N * 2; i++) {
cin >> box_info;
dQ.push_back({ box_info, false });
}
while (K_temp < K) {
Robot_Move();
Robot_Check();
Robot_Setting();
if (Robot_Finish())break;
stage++;
}
cout << stage;
}