📕알고리즘 문제/📝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
반응형