'시뮬레이션' 문제로 문제의 조건을 따라 차근차근 구현하면됩니다.
- 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
//벨트의 상태를 한 칸 회전
int save = belt[2 * N - 1];
belt.pop_back();
belt.insert(belt.begin(), save);
//로봇의 상태를 한 칸 회전
for(auto it = robot.begin(); it != robot.end(); it++) {
int move = (*it) + 1;
if(move == 2 * N)
move = 0;
*it = move;
}
언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다.
vector<int>::iterator itr;
itr = find(robot.begin(), robot.end(), N - 1);
if(itr != robot.end()) {
robot.erase(itr);
}
- 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.
- 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
for(auto it = robot.begin(); it != robot.end(); it++) {
int next = (*it) + 1;
if(next == 2 * N)
next = 0;
int chk;
if(it == robot.begin()) {
chk = robot[robot.size() - 1];
}
else {
chk = *(it - 1);
}
if((chk != next) && (belt[next] >= 1)) {
(*it)++;
if(*it == 2 * N)
*it = 0;
belt[next]--;
}
}
- 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
if(belt[0] != 0) {
vector<int>::iterator itr;
itr = find(robot.begin(), robot.end(), 0);
if(itr == robot.end()) {
belt[0]--;
robot.push_back(0);
}
}
- 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.
for(auto it = belt.begin(); it != belt.end(); it++) {
if(*it == 0)
cnt++;
if(cnt >= K)
return stage;
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int T, N, K;
vector<int> belt;
vector<int> robot;
int solver(int stage) {
//1
int save = belt[2 * N - 1];
belt.pop_back();
belt.insert(belt.begin(), save);
for(auto it = robot.begin(); it != robot.end(); it++) {
int move = (*it) + 1;
if(move == 2 * N)
move = 0;
*it = move;
}
//Delete!!
vector<int>::iterator itr;
itr = find(robot.begin(), robot.end(), N - 1);
if(itr != robot.end()) {
robot.erase(itr);
}
for(auto it = robot.begin(); it != robot.end(); it++) {
int next = (*it) + 1;
if(next == 2 * N)
next = 0;
int chk;
if(it == robot.begin()) {
chk = robot[robot.size() - 1];
}
else {
chk = *(it - 1);
}
if((chk != next) && (belt[next] >= 1)) {
(*it)++;
if(*it == 2 * N)
*it = 0;
belt[next]--;
}
}
//Delete
vector<int>::iterator itr2;
itr2 = find(robot.begin(), robot.end(), N - 1);
if(itr2 != robot.end()) {
robot.erase(itr2);
}
if(belt[0] != 0) {
vector<int>::iterator itr;
itr = find(robot.begin(), robot.end(), 0);
if(itr == robot.end()) {
belt[0]--;
robot.push_back(0);
}
}
int cnt = 0;
for(auto it = belt.begin(); it != belt.end(); it++) {
if(*it == 0)
cnt++;
if(cnt >= K)
return stage;
}
return solver(stage + 1);
}
int main() {
//scanf("%d", &T);
T = 1;
for(int tc = 0; tc < T; tc++) {
scanf("%d %d", &N, &K);
int tmp;
belt.resize(2 * N, 0);
robot.clear();
for(int i = 0; i < 2 * N; i++) {
scanf("%d", &tmp);
belt[i] = tmp;
}
printf("%d\n", solver(1));
}
return 0;
}