백준 20055 컨베이어 벨트 위의 로봇 문제풀이(C++)

YooHeeJoon·2023년 1월 17일
0

백준 문제풀이

목록 보기
42/56

백준 20055 컨베이어 벨트 위의 로봇

아이디어

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;
}

0개의 댓글