본문 바로가기
백준 알고리즘/구현

컨베이어 벨트 위의 로봇 C++

by paysmile 2021. 3. 1.

https://www.acmicpc.net/problem/20055

 

20055번: 컨베이어 벨트 위의 로봇

길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부

www.acmicpc.net

#include <iostream>
#include <vector>

using namespace std;

int n, k;
vector<pair<int, int>> robot;

int CheckZero() {
	int answer = 0;

	for (int i = 0; i < robot.size(); i++) {
		if (robot[i].first == 0)
			answer++;
	}

	return answer;
}

void RotateBelt() {
	pair<int,int> temp = robot[robot.size() - 1];

	for (int i = robot.size() - 2; i >= 0; i--) robot[i + 1].first = robot[i].first;

	for (int i = n - 2; i >= 0; i--) robot[i + 1].second = robot[i].second;

	robot[0].first = temp.first;
	robot[0].second = 0;
}

void MoveRb() {
	for (int i = n-1; i >=0 ; i--) {

		if (robot[i].second == 1) {
			if (i == n - 1) {
				robot[i].second = 0;
			}
			else {
				if (robot[i + 1].first > 0 && robot[i + 1].second == 0) {
					robot[i + 1].second = 1;
					robot[i].second = 0;
					robot[i + 1].first -= 1;
				}
			}
		}
	}
}

void UpRb() {
	if (robot[0].first > 0 && robot[0].second == 0) {
		robot[0].second += 1;
		robot[0].first -= 1;
	}
}

int main(void) {
	int temp, answer = 0;
	cin >> n >> k;

	for (int i = 0; i < 2 * n; i++) {
		cin >> temp;
		robot.push_back(make_pair(temp, 0));
	}

	while (CheckZero() < k) {
		RotateBelt();
		MoveRb();
		UpRb();
		answer++;
	}
	cout << answer;
	return 0;
}

'백준 알고리즘 > 구현' 카테고리의 다른 글

모노미노도미노 2  (0) 2021.03.08
어른 상어 C++  (0) 2021.03.04
마법사 상어와 토네이도  (0) 2021.02.22
마법사 상어와 파이어볼 C++  (0) 2021.02.18
백준 2960번 C++  (0) 2019.02.18