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

Nitroblue 1·2026년 3월 21일

코딩테스트 준비

목록 보기
71/102

sol : 24' 41''

Learnings

  • 골드5는 확실히 쉬워졌다.
#include <iostream>
#include <deque>

#define MAX_N 100

using namespace std;

int n, k;
deque<int> belt;
bool robot[MAX_N];
int lift_spot;
int drop_spot;

void Init() {
	cin >> n >> k;

	for (int i = 0; i < 2 * n; i++) {
		int negudo;
		cin >> negudo;
		belt.push_back(negudo);
	}

	for (int i = 0; i < n; i++) {
		robot[i] = false;
	}

	lift_spot = 0;
	drop_spot = n - 1;
}

void Rotate() {
	// belt rotate
	int back = belt.back();
	belt.pop_back();
	belt.push_front(back);

	// robot rotate
	for (int i = drop_spot; i > 0; i--) {
		if (robot[i - 1]) {
			robot[i - 1] = false;
			if (i != drop_spot) robot[i] = true;
		}
	}
}

void RobotMove() {
	for (int i = drop_spot - 1; i >= lift_spot; i--) {
		if (robot[i]) {
			if (!robot[i + 1] && belt[i + 1] >= 1) {
				robot[i] = false;
				belt[i + 1]--;
				if (i + 1 != drop_spot) robot[i + 1] = true;
			}
		}
	}
}

void Lift() {
	if (belt[lift_spot] != 0) {
		robot[lift_spot] = true;
		belt[lift_spot]--;
	}
}

bool FinCheck() {
	int cnt = 0;
	for (int i = 0; i < belt.size(); i++) {
		if (belt[i] == 0) cnt++;
	}

	if (cnt >= k) return true;
	else return false;
}

int main() {
	Init();

	int turn = 0;
	while (true) {
		turn++;

		// 1. Rotate
		Rotate();

		// 2. RobotMove
		RobotMove();

		// 3. Lift
		Lift();

		// 4. Fin Check
		if (FinCheck()) break;
	}

	cout << turn;

	return 0;
}

0개의 댓글