1번 : 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
// rotate함수 간단하게 구현 void rotate_robot(vector<pair<int, bool>>& belt, const int belt_size) { // N지점 == 내리는 지점 체크 belt[belt_size / 2 - 1].second = false; for (int i = 0; i < belt_size; i++) { swap(belt[0], belt[i]); } }
2번 : 회전하는 방향으로 한 칸 이동 / (이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.)
void move_robot(vector<pair<int, bool>>& belt, const int half_of_belt_size, int& zero_count) { // N지점 == 내리는 지점 체크 belt[half_of_belt_size].second = false; for (int i = half_of_belt_size - 1; i >= 0; i--) { // 이동하려는 칸에 로봇이 없고 내구도가 1 이상 if (belt[i].second && !belt[i + 1].second && belt[i + 1].first) { belt[i + 1].first -= 1; if (!belt[i + 1].first) { zero_count += 1; } // 내구도 0 체크 belt[i + 1].second = true; belt[i].second = false; } } }
3번 : 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
if (belt[0].first && !belt[0].second) { belt[0].first -= 1; if (!belt[0].first) { zero_count += 1; } // 내구도 0 체크 belt[0].second = true; }
4번 : 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.
int robot_move_count = 0; int zero_count = 0; while (zero_count < k) { rotate_robot(belt, belt_size); move_robot(belt, belt_size / 2 - 1, zero_count); robot_move_count++; }
#include<bits/stdc++.h>
using namespace std;
void rotate_robot(vector<pair<int, bool>>& belt, const int belt_size)
{
belt[belt_size / 2 - 1].second = false;
for (int i = 0; i < belt_size; i++)
{
swap(belt[0], belt[i]);
}
}
void move_robot(vector<pair<int, bool>>& belt, const int half_of_belt_size, int& zero_count)
{
belt[half_of_belt_size].second = false;
for (int i = half_of_belt_size - 1; i >= 0; i--)
{
if (belt[i].second && !belt[i + 1].second && belt[i + 1].first)
{
belt[i + 1].first -= 1;
if (!belt[i + 1].first) { zero_count += 1; }
belt[i + 1].second = true;
belt[i].second = false;
}
}
if (belt[0].first && !belt[0].second)
{
belt[0].first -= 1;
if (!belt[0].first) { zero_count += 1; }
belt[0].second = true;
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
int n, k;
cin >> n >> k;
const int belt_size = 2 * n;
vector<pair<int, bool>>belt(belt_size);
for (int i = 0; i < belt_size; i++)
{
cin >> belt[i].first;
}
int robot_move_count = 0;
int zero_count = 0;
while (zero_count < k)
{
rotate_robot(belt, belt_size);
move_robot(belt, belt_size / 2 - 1, zero_count);
robot_move_count++;
}
cout << robot_move_count << '\n';
return 0;
}