https://www.acmicpc.net/problem/20055

 

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

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

www.acmicpc.net

접근

문제는 어렵지 않았는데 문제의 모호한 표현들을 해석하는데 애를 먹었다.

  1. 1번 과정 컨베이어가 움직이는 과정에서는 로봇이 움직이는 것이 아니기 때문에 내구도가 소모되지 않는다.
  2. 2번 과정에서 로봇이 움직이고 나서 내리는 칸으로 이동할 경우, 이 로봇은 바로 컨베이어에서 내려가는 것이 아니라 다음 사이클의 1번 과정에서 내려가게 된다. 즉, 1번 과정에서는 컨베이어가 움직이기 전과 후에 모두 내리는 위치의 로봇을 내려줘야 한다.

위의 조건들을 명확하게 구현하면 문제를 해결할 수 있다.

컨베이어의 이동은 리스트를 이동시키지 않고, 시작(올리는 위치)과 끝(내리는 위치)의 인덱스를 이용하여 간단히 문제를 해결하였다.

코드

#include<iostream>

using namespace std;

#define endl '\n'

int N, K;
int ARR[201];
int ROBOT[201];
int up, down, cnt;
int i, j, ans;


int main(int argc, char** argv)
{
    // freopen 주석 처리
    // freopen("input.txt", "r", stdin);

    cin >> N >> K;
    for (int k = 0; k < 2 * N; k++)
    {
        cin >> ARR[k];
    }

    up = 0;  // 로봇 올리는 위치
    down = N - 1;  // 로봇 내리는 위치
    ans = 0;  // 컨베이어 이동 횟수
    while (1)
    {
        ans++;
        // 1. 내리는 위치의 로봇을 내리고, 컨베이어를 한칸씩 이동하며, 다시 내리는 위치의 로봇을 내린다.
        ROBOT[down] = 0;
        up--;
        down--;
        if (up == -1) up = 2 * N - 1;
        if (down == -1) down = 2 * N - 1;
        i = up;
        while (i != down)
        {
            i++;
            if (i == 2 * N) i = 0;
        }
        ROBOT[i] = 0;
        // 2. 내리는 위치부터 거꾸로 탐색하여 조건을 만족할 경우 로봇이 한칸 이동하고 내구도를 1 감소
        j = i;
        while (i != up)
        {
            i--;
            if (i == -1) i = 2 * N - 1;
            if (ROBOT[i] == 1 && ROBOT[j] == 0 && 0 < ARR[j])
            {
                ROBOT[i] = 0;
                ROBOT[j] = 1;
                ARR[j]--;
                if (ARR[j] == 0) cnt++;
            }
            j = i;
        }
        // 3. 올리는 위치의 내구도가 1 이상이라면 로봇을 올리고 내구도를 1 감소
        if (0 < ARR[i])
        {
            ROBOT[i] = 1;
            ARR[i]--;
            if (ARR[j] == 0) cnt++;
        }
        // 4. 내구도 0인 칸의 갯수가 K개 이상이라면 break
        if (K <= cnt) break;
    }

    cout << ans << endl;
    return 0;
}

더 생각해 볼 것?

...

코드나 내용 관련 조언, 부족한 점 및 질문 언제든 환영합니다!

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기