본문 바로가기
  • 저희는 평생 개발할 운명이걸랑요
오늘의 코드/SpaciousKitchen

[백준_20055(컨베이어 벨트 위의 로봇 )]

by SpaciousKitchen 2021. 4. 24.

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

 

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

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

www.acmicpc.net

문제 설명

문제 풀이

  • 시뮬레이션 으로 가능하다.
  • 컨베이어 벨트는 2N이고 로봇은 N벨트에서 움직인다.
  • 이 부분을 케치하지 못했다. 처음에 로봇도 2N으로 풀어버리는 실수를 범했다.

문제 순서

  1. 컨베이어 벨트 이동
    • 로봇과 같이 컨베이어 벨트가 이동한다.
    1. 컨베이어 벨트 이동

    • 해당 규칙을 따라 이동한다.
     
    1. 로봇의 이동
      • 1~ N-1까지의 로봇이 컨베이어 벨트를 따라 이동한다. N-1위치에 있는 로봇은 내려간다.
  2. 로봇의 이동
    • 1~ N-1까지의 로봇만 이동한디.
      • 로봇이 있거나, 내구도가 0이라면 남아있는다.
      • 로봇이 없고 내구도가 1이상이면 다음 칸으로 이동하고 이동한 칸의 내구도를 1줄인다.
        • 줄인 뒤에 현재 내구도가 0이면 카운팅한다.
  3. 로봇 추가
    • 로봇이 없고 내구도가 1이상이면 다음 칸으로 이동하고 이동한 칸의 내구도를 1줄인다.
      • 줄인 뒤에 현재 내구도가 0이면 카운팅한다.
  4. 전체 내구도가 0인 칸의 갯수가 K이상이면 종료한다.
#include <iostream>
#include <cstring>
using namespace std;

int N;
int K;
int belt[2][101];
int robots[101];

void move()
{
    //로봇및 컨베이어 벨트 이동

    int temp[2][101];
    int ro[101];

    temp[1][N - 1] = belt[0][N - 1]; //첫 번째 컨베이어 벨트의 마지막을 두번째 벨트로 이동
    temp[0][0] = belt[1][0];         // 두 번째의 컨베이어 벨트를 첫번째로 이동

    ro[N - 1] = 0; //로봇 떨어짐
    ro[0] = 0;

    for (int i = 0; i < N - 1; i++)
    {
        //첫번째 컨베이어 벨트 이동

        temp[0][i + 1] = belt[0][i];
        ro[i + 1] = robots[i]; //로봇도 함께 이동
    }

    for (int i = N - 1; i > 0; i--)
    { //두번째 컨베이어 벨트 이동

        temp[1][i - 1] = belt[1][i];
    }

    memcpy(belt, temp, sizeof(temp));
    memcpy(robots, ro, sizeof(ro));
}

int main(void)
{

    cin >> N >> K;

    for (int i = 0; i < N; i++)
    {

        cin >> belt[0][i];
    }

    for (int i = N - 1; i >= 0; i--)
    {

        cin >> belt[1][i];
    }

    int count = 1;
    int ans = 0;

    while (true)
    {

        move();

        robots[N - 1] = 0; //N-1로봇 내려감

        for (int i = N - 2; i >= 0; i--)
        {

            if (robots[i]) //로봇이 있을 때,
            {

                if (robots[i + 1] == 0 && belt[0][i + 1])
                {
                    //다음칸에 로봇이 없고 내구성이 1이상일때 , 이동
                    robots[i + 1] = robots[i];
                    robots[i] = 0;
                    belt[0][i + 1]--;

                    if (belt[0][i + 1] == 0)
                    {
                        //줄여진 내구성 카운팅
                        ans++;
                    }
                }
            }
        }

        if (robots[0] == 0 && belt[0][0])
        {
            //첫번째 로봇 추가
            robots[0] = 1;
            belt[0][0]--;

            if (belt[0][0] == 0)
            {
                ans++;
            }
        }

        if (ans >= K)
        {
            //k이상이면 스톱

            break;
        }
        count++;
    }

    cout << count << '\n';

    return 0;
}

 

댓글