컨베이어 벨트 위의 로봇

108번뇌·2021년 6월 5일
0

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;
}
  1. 회전하는 문제인 경우에는 deque 이용한다.
profile
내일 아침 눈을 떳을 때, '기대되는 오늘 하루를 만들기 위해' 나는 오늘도 생각하고 고민한다.

0개의 댓글