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

컨베이어 벨트 위의 로봇

by paysmile 2021. 10. 12.

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;
pair<int, int> robot[250]; //exist, value
bool FindZero() {
	int count = 0;
	for (int i = 0; i < 2 * n; i++) {
		if (robot[i].second == 0) count++;
		if (count >= k) {
			return false;
		}
	}
	return true;
}
void MoveBelt() {
	pair<int, int> tmp = robot[0];
	robot[0] = make_pair(0, robot[2 * n - 1].second);
	for (int i = 2 * n - 1; i > 1; i--) {
		robot[i].second = robot[i - 1].second;
		if (i <= n - 1) {
			robot[i].first = robot[i - 1].first;
		}
		else {
			robot[i].first = 0;
		}
	}
	robot[1] = tmp;
}
void MoveRobot() {
	if (robot[n - 1].first == 1) {
		robot[n - 1].first = 0;
		robot[n] = make_pair(0, robot[n].second);
	}
	for (int i = n - 2; i >= 0; i--) {
		if (robot[i].first == 1) {
			if (robot[i + 1].second > 0 && robot[i + 1].first == 0) {
				robot[i].first = 0;
				robot[i + 1] = make_pair(1, robot[i + 1].second - 1);
			}
		}
	}

	if (robot[0].first == 0 && robot[0].second > 0) {
		robot[0].first = 1;
		robot[0].second -= 1;
	}
}
int main(void) {
	cin >> n >> k;
	for (int i = 0; i < 2 * n; i++) {
		int tp;
		cin >> tp;
		robot[i] = make_pair(0, tp);
	}
	int answer = 0;
	while (FindZero()) {
		answer++;
		MoveBelt();
		MoveRobot();
	}

	cout << answer << endl;
}

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

파이프 옮기기 1 C++  (0) 2021.10.13
어른 상어 C++  (0) 2021.10.13
마법사 상어와 파이어볼 C++  (0) 2021.09.30
마법사 상어와 토네이도 C++  (0) 2021.09.30
상어 초등학교 C++  (0) 2021.09.18