[C++]백준20055번 컨베이어 벨트 위의 로봇

1 minute read

문제는 다음과 같다.

오늘은 백준20055번 컨베이어 벨트 위의 로봇 문제를 풀어보도록 하자. 처음에 문제이해를 못했다. 지문이 좀 이상한 듯..?해서 질문을 보고 이해했다. 로봇은 Index = 0에서 입장 할 수 있고, Index = N - 1에서 퇴장한다.

그리고 다음과 같은 로직을 따라 계속 움직인다.

  1. 벨트가 각 칸 위에 있는 로봇들과 함께 한 칸 회전한다. 내리는 위치에 있는 로봇은 내린다.

  2. 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다. 로봇이 이동하기 위해서는 로봇이 내리는 위치가 아니고, 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.

  3. 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.

  4. 내구도가 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;
}