📕알고리즘 문제/📝Baekjoon

[백준] 골드5 : (20055) 컨베이어 벨트 위의 로봇

주으기 2025. 2. 17. 13:55
728x90
반응형

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

 

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N, K, Answer = 0;
	cin >> N >> K;

	// first = 로봇 여부, second = 벨트 칸 번호
	vector<pair<bool, int>> Belt;

	for (int i = 0, j; i < N * 2; ++i)
		cin >> j, Belt.push_back({ false, j });

	// 컨베이어 벨트위에 올려진 로봇
	// 선입선출로 계산 과정이 이뤄지기에 queue로 저장
	queue<int> Robot;

	while (K > 0)
	{
		Answer++;

		// 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
		Belt.insert(Belt.begin(), Belt.back());
		Belt.pop_back();

		int size = Robot.size();
		for (int i = 0; i < size; ++i)
		{
			// 벨트가 회전하며, 로봇도 한 칸 이동하기 때문에 1을 올려준다.
			int CurBelt = ++Robot.front();
			Robot.pop();

			// 벨트가 회전하며 로봇이 내리는 위치에 도달한 경우, 로봇을 내린다.
			if (CurBelt >= N - 1) { Belt[CurBelt].first = false; continue; }

			// 로봇이 다음 벨트 칸으로 이동할 수 있는 경우
			int NextBelt = CurBelt + 1;
			if (Belt[NextBelt].first == false && Belt[NextBelt].second > 0)
			{
				// 이동 전 로봇이 있던 칸은 로봇 없음으로 초기화
				Belt[CurBelt].first = false;

				// 이동 후의 로봇 위치가 내리는 위치라면, 내린다.
				// 로봇이 이동했으므로, 해당 칸 내구도를 1깎는다.
				if (NextBelt >= N - 1) --Belt[NextBelt].second == 0 ? K-- : 0;
				else
				{
					// 로봇이 이동한 칸을 로봇 있음으로 초기화
					Belt[NextBelt].first = true;

					// 로봇이 이동했으므로, 해당 칸 내구도를 1깎는다.
					--Belt[NextBelt].second == 0 ? K-- : 0;

					// 이동한 위치로 로봇 위치 갱신
					Robot.push(NextBelt);
				}
			}
			// 로봇이 이동할 수 없는 경우, 그냥 가만히 둔다.
			else Robot.push(CurBelt);
		}

		// 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
		if (Belt[0].second > 0)
		{
			Belt[0].first = true, Belt[0].second--;
			Robot.push(0);
			if (Belt[0].second <= 0) K--;
		}
	}

	cout << Answer << "\n";
}

 

 

 

 

 

728x90
반응형