https://www.acmicpc.net/problem/20055
#include <deque>
#include <iostream>
#include <vector>
using namespace std;
deque<int> naegudo;
deque<bool> conveyer;//컨베이어 위에 로봇이 있는지 없는지 여부. 있음 true 없음 false
int N;
int K;
//1.벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다. 내리는 위치 로봇은 내린다.
void rotate()
{
conveyer.push_front(conveyer.back());//컨베이어 회전한다.
conveyer.pop_back();
naegudo.push_front(naegudo.back());//내구도도 컨베이어 칸과 같이 회전한다.
naegudo.pop_back();
conveyer[N - 1] = false;//내리는 위치 로봇은 내린다.
}
//2. 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동. 만약 이동할 수 없다면 가만히 있는다.
void move()
{
for (int i = N - 2; i >= 0; i--)//로봇이 이동하기 위해서 로봇이 내리는 위치가 아니기때문에 N-2부터 간다.
{
if ((conveyer[i]) && (!conveyer[i + 1]) && (naegudo[i + 1] >= 1))//칸에 로봇이 있고 이동하려는 칸에 로봇 없고, 내구도 1이상
{
conveyer[i + 1] = true;//한칸진행
conveyer[i] = false;
naegudo[i + 1]--;
}
}
conveyer[N-1] = false;//위의 진행과 상관없이 내리는 위치에서 내린다.
}
void put_robot()//올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
{
if ((!conveyer[0])&&(naegudo[0] > 0))//컨베이어엔 없어야함.
{
conveyer[0] = true;//올리는 위치는 0인덱스임.
naegudo[0]--;//올리는 위치에 올리면 내구도 하락한다.
}
}
int naegudo_check()
{
int iNaegudoChk = 0;
for (size_t i = 0; i < naegudo.size(); i++)
{
if (naegudo[i] == 0)
{
iNaegudoChk++;
}
}
return iNaegudoChk;
}
int main()
{
cin >> N >> K;
for (int i = 0; i < 2*N; i++)
{
int iTemp;
cin >> iTemp;
naegudo.push_back(iTemp);//내구도 대입
conveyer.push_back(false);//처음엔 아무것도 들어가지 않음
}
int iResult = 1;
int iChk = 0;
while (1)
{
rotate();//회전하고
move();//움직이고
put_robot();//로봇넣고
iChk = naegudo_check();
if (iChk >= K)
{
cout << iResult;
break;
}
iResult++;
}
return 0;
}