[백준 20055번 C/C++] 컨베이어 벨트 위의 로봇
[백준 20055번 C/C++] 컨베이어 벨트 위의 로봇
https://www.acmicpc.net/problem/20055
해결전략
구현, 브루트 포스 Brute Force
정답코드
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
int n, k; // n: 컨베이어 길이, k: 내구도가 0인 칸의 개수 한계수
int answer; // 몇 번째 단계인가
deque<pair<int, bool>> dQ; // 내구도, 로봇 배치 여부
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> k;
for (int i = 0; i < 2 * n; i++) {
int input;
cin >> input;
dQ.push_back({ input, false });
}
while (true)
{
answer++;
// 1. 벨트 회전
dQ.push_front(dQ.back());
dQ.pop_back();
// 로봇이 내려가는 위치(n-1)에서 로봇을 내려야 한다.
if (dQ[n - 1].second) {
dQ[n - 1].second = false;
}
// 2. 로봇 이동
for (int i = n - 2; i >= 0; i--)
{
// 현재 위치에 로봇이 있음 && 다음 위치에 로봇 없음 && 다음 위치에 내구도 > 0
if (dQ[i].second && false == dQ[i + 1].second && dQ[i + 1].first > 0)
{
dQ[i].second = false; // 로봇 이동 후 i번째 위치에 없으니 false
dQ[i + 1].second = true; // 로봇 이동 후 i+1번째 위치에 있으니 true
dQ[i + 1].first--; // 내구도--
if (dQ[i + 1].first == 0) k--; // 만약 내구도가 0이 되었다면 k--
}
}
// 로봇이 내려가는 위치(n-1)에서 로봇을 내려야 한다.
if (dQ[n - 1].second) {
dQ[n - 1].second = false;
}
// 3. 첫 번째 위치에 로봇 올리기
if (dQ[0].first > 0) {
dQ[0].second = true; // 0번째 위치에 로봇 올리기
dQ[0].first--; // 내구도--
if (dQ[0].first == 0) k--; // 만약 내구도가 0이 되었다면 k--
}
// 4. 내구도가 0인 칸이 k개 이상이면 종료
if (k <= 0) break;
}
cout << answer;
return 0;
}
내구도가 음수가 될 수 있으니
if (dQ[i + 1].first == 0) k--;
다음과 같이 체크해도 중복체크되지 않는다.
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 2573번 C/C++] 빙산 (0) | 2024.08.26 |
---|---|
[백준 1062번 C/C++] 가르침 (0) | 2024.08.19 |
[백준 2098번 C/C++] 외판원 순회 (0) | 2024.08.08 |
[백준 14391번 C/C++] 종이 조각 (0) | 2024.08.07 |
[백준 15661번 C++] 링크와 스타트 (0) | 2024.08.06 |
댓글
이 글 공유하기
다른 글
-
[백준 2573번 C/C++] 빙산
[백준 2573번 C/C++] 빙산
2024.08.26 -
[백준 1062번 C/C++] 가르침
[백준 1062번 C/C++] 가르침
2024.08.19 -
[백준 2098번 C/C++] 외판원 순회
[백준 2098번 C/C++] 외판원 순회
2024.08.08 -
[백준 14391번 C/C++] 종이 조각
[백준 14391번 C/C++] 종이 조각
2024.08.07