-
백준 - 컨베이어 벨트 위의 로봇 (20055) [C++]문제 풀이/백준 2024. 9. 26. 13:04반응형
이 문제는 구현, 시뮬레이션 문제이다.
문제의 요구사항 자체는 단순했으나 문제 자체가 약간 이해하기 어려웠다.
N번 칸에 도착하면 무조건 로봇이 빠지고, 로봇과 상관없이 벨트는 N + 1 ~ 2N까지 밑으로 움직인다는 것을 이해하는데 시간이 좀 걸렸다.
내구도를 나타내는 A 배열과 robot의 존재 여부를 나타내는 robots 배열 두개를 만들어 간단하게 구현할 수 있었다.
#include <iostream> #include <vector> using namespace std; int N, K; vector<int> A; vector<bool> robots; bool isEnd() { int cnt = 0; for (int i = 0; i < 2 * N; i++) { if (A[i] == 0) { cnt++; } } if (cnt >= K) { return true; } return false; } void rotate() { vector<int> next(2 * N); vector<bool> nextRobot(2 * N); for (int i = 0; i < 2 * N - 1; i++) { next[i + 1] = A[i]; nextRobot[i + 1] = robots[i]; } next[0] = A[2 * N - 1]; nextRobot[0] = robots[2 * N - 1]; if (nextRobot[N - 1]) { nextRobot[N - 1] = false; } A = next; robots = nextRobot; } void moveRobot() { for (int i = N - 2; i >= 0; i--) { if (robots[i] && !robots[i + 1] && A[i + 1] > 0) { robots[i] = false; robots[i + 1] = true; A[i + 1]--; } } if (robots[N - 1]) { robots[N - 1] = false; } } void upRobot() { if (!robots[0] && A[0] > 0) { robots[0] = true; A[0]--; } } int solve() { int step = 1; while (true) { // 1. rotate rotate(); // 2. robot move moveRobot(); // 3. robot up upRobot(); // 4. check end if (isEnd()) { return step; } // after step++; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> N >> K; A = vector<int>(2 * N); robots = vector<bool>(2 * N, false); for (int i = 0; i < 2 * N; i++) { cin >> A[i]; } cout << solve() << '\n'; return 0; }
반응형'문제 풀이 > 백준' 카테고리의 다른 글
백준 - 가운데를 말해요 (1655) [C++] (0) 2024.11.04 백준 - 마법사 상어와 비바라기 (21610) [C++] (2) 2024.10.06 백준 - 마법사 상어와 토네이도 (20057) [C++] (0) 2024.09.25 백준 - 청소년 상어 (19236) [C++] (0) 2024.09.23 백준 - 연구소 3 (17142) [C++] (0) 2024.09.14