ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 - 컨베이어 벨트 위의 로봇 (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;
    }
    반응형
Designed by Tistory.