[백준] 20055. 컨베이어 벨트 위의 로봇

2 분 소요

문제 링크

[백준] 20055. 컨베이어 벨트 위의 로봇


풀이 과정

문제의 조건에 맞게 구현하는 시뮬레이션 문제입니다.


while (cnt < K) {
    step++;
    rotate();
    move();
    up();
}

스텝을 증가시키며, rotate, move, up 메소드를 차례로 수행합니다.


static void rotate() {
    int tmp_A = A[SIZE - 1];
    boolean tmp_B = B[SIZE - 1];

    for (int i = SIZE - 1; i >= 1; i--) {
        A[i] = A[i - 1];
        B[i] = B[i - 1];
    }

    A[0] = tmp_A;
    B[0] = tmp_B;

    if (B[N - 1]) B[N - 1] = false;
}

rotate 메소드 는 컨베이어 벨트를 시계방향으로 한바퀴 회전시킵니다. 배열 A(내구도)와 B(로봇의 유무)를 각각 한칸씩 시계방향으로 회전시킵니다. 회전이 끝나고 나면, N-1 인덱스에 있는 로봇을 땅으로 내려보냅니다.


static void move() {
    for (int i = N - 2; i >= 1; i--) {
        if (!B[i]) continue;

        int next = (i + 1) % SIZE;
        if (!B[next] && A[next] >= 1) {
            if (--A[next] == 0) cnt++;
            B[i] = false;
            B[next] = next != N - 1 ? true : false;
        }
    }
}

move 메소드 는 가장 먼저 컨베이어 벨트에 올라간 로봇부터 벨트 회전 방향으로 한 칸 이동시킵니다. 가장 먼저 컨베이어 벨트에 올라간 로봇은 해당 회차에 내려가는 위치에서 가까운 순서를 의미하게 됩니다. 따라서, N-2 인덱스를 기준으로 시계 반대 방향, 즉 인덱스를 하나씩 감소시켜가며 로봇이 있는지 판단합니다. 해당 칸에 로봇이 존재하며, 이동하려는 칸에 로봇이 없으며, 내구도가 1이상 남아있다면 로봇을 전진시킵니다.


static void up() {
    if (!B[0] && A[0] >= 1) {
        if (--A[0] == 0) cnt++;
        B[0] = true;
    }
}

up 메소드올라가는 위치인 인덱스 0 칸에 로봇이 없고, 내구도가 1 이상이면 새로운 로봇을 올립니다.


코드

import java.util.Scanner;

public class Main {
    static int N, K, SIZE;
    static int[] A;
    static boolean[] B;
    static int step, cnt;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        K = sc.nextInt();
        SIZE = 2 * N;
        A = new int[SIZE];
        B = new boolean[SIZE];

        for (int i = 0; i < SIZE; i++) A[i] = sc.nextInt();

        while (cnt < K) {
            step++;
            rotate();
            move();
            up();
        }

        System.out.println(step);
    }

    static void rotate() {
        int tmp_A = A[SIZE - 1];
        boolean tmp_B = B[SIZE - 1];

        for (int i = SIZE - 1; i >= 1; i--) {
            A[i] = A[i - 1];
            B[i] = B[i - 1];
        }

        A[0] = tmp_A;
        B[0] = tmp_B;

        if (B[N - 1]) B[N - 1] = false;
    }

    static void move() {
        for (int i = N - 2; i >= 1; i--) {
            if (!B[i]) continue;
            int next = (i + 1) % SIZE;
            if (!B[next] && A[next] >= 1) {
                if (--A[next] == 0) cnt++;
                B[i] = false;
                B[next] = next != N - 1 ? true : false;
            }
        }
    }

    static void up() {
        if (!B[0] && A[0] >= 1) {
            if (--A[0] == 0) cnt++;
            B[0] = true;
        }
    }
}

카테고리:

업데이트:

댓글남기기