Tech/Algorithm

[BOJ] 백준 20055 컨베이어 벨트 위의 로봇 c++ (구현)

0m1n 2023. 1. 11. 11:47
728x90
반응형

문제 출처 : https://www.acmicpc.net/problem/20055

 

20055번: 컨베이어 벨트 위의 로봇

길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부

www.acmicpc.net


풀이

이동하는 벨트에서 로봇 공정이 얼마나 진행될 수 있는지 판단하는 구현 문제이다.

처음 내구도, 로봇 여부를 pair vector로 받아 구현하였고 문제에서 제시된 단계대로 구현하였다.


1. 벨트 이동

deque등으로 직접 옮기는 방법도 있으나,  idx를 옮기는 방식으로 구현하였다.

시계방향으로 벨트가 이동하므로 idx를 왼쪽으로 한칸 옮기면 된다.

여기서 주의할 점은 idx가 0에서 왼쪽으로 가면 2N-1이 되므로 모듈러 연산을 통해 구현해야 한다.

이렇게 idx이동을 통해 벨트를 한칸 이동시키고 내리는 위치도 유동적으로 구해준다.

upIdx = (upIdx + (N * 2) - 1) % (N * 2); // 벨트 이동
int downIdx = (upIdx + N - 1) % (N * 2); // 내리는 위치

 

2. 로봇이 내리는 조건

문제에서 상세하게 설명이 되어있지 않아 초반에 헷갈렸으나,

벨트 이동전 & 후 모두 내리는 위치에 있으면 바로 내려주면 된다.


코드

#include <bits/stdc++.h>

using namespace std;

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

    int N, K;
    cin >> N >> K;
    vector<pair<int, bool>> v(N * 2, {0, false});
    for(int i = 0; i < N * 2; i++)
        cin >> v[i].first;

    int upIdx = 0; // 올리는 위치
    int ans = 1;
    while(true){
        upIdx = (upIdx + (N * 2) - 1) % (N * 2); // 벨트 이동
        int downIdx = (upIdx + N - 1) % (N * 2); // 내리는 위치
        if(v[downIdx].second)
            v[downIdx].second = false; // 로봇있으면 내림
        for(int i = upIdx + N - 1; i >= upIdx; i--){
            int nowIdx = i % (N * 2); // i가 2N보다 클 수 있음
            int nextIdx = (nowIdx + 1) % (N * 2);
            if(v[nowIdx].second && (!v[nextIdx].second && v[nextIdx].first > 0)){
                v[nowIdx].second = false;
                v[nextIdx].first--;
                v[nextIdx].second = true;
            }
        }
        if(v[downIdx].second)
            v[downIdx].second = false; // 로봇있으면 내림
        // 새로운 로봇 올리기
        if(v[upIdx].first > 0){
            v[upIdx].first--;
            v[upIdx].second = true;
        }
        // 내구도 0 카운트
        int cnt = 0;
        for(auto elem : v){
            if(elem.first == 0)
                cnt++;
        }
        if(cnt >= K) break;
        ans++;
    }
    cout << ans << '\n';
	return 0;
}
728x90
반응형