코테/JAVA

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

쇼티드 2023. 7. 24. 01:46
728x90
반응형

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

 

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

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

www.acmicpc.net

 

단순 구현 문제이다.

 

    public static void Rotate() {
        up--;
        if (up < 0) up = 2 * N - 1;
        down--;
        if (down < 0) down = 2 * N - 1;
        if (isRobot[down] == true) {
            robot.remove(0);
            isRobot[down] = false;
        }
        moveRobot();
    }

1번 설명처럼 컨베이어 벨트를 한 칸 회전 시킨다.

up은 로봇을 올리는 위치, down은 내리는 위치이다. 각 위치를 변경시킨다.

 

    public static void moveRobot() {
        if (!robot.isEmpty()) {
            for (int i = 0; i < robot.size(); i++) {
                //로봇 이동 가능
                int nextLocation = (robot.get(i) + 1) % (2 * N);
                if (isRobot[nextLocation] == false && A[nextLocation] > 0) {
                    robot.set(i, nextLocation);
                    isRobot[nextLocation] = true;

                    if (nextLocation == 0)
                        isRobot[2 * N - 1] = false;
                    else
                        isRobot[nextLocation - 1] = false;

                    A[nextLocation]--;
                    if (A[nextLocation] == 0) cnt++;
                }
            }
        }

        if (isRobot[down] == true) {
            isRobot[down] = false;
            robot.remove(0);
        }
        addRobot();
    }

2번 설명처럼 로봇을 한 칸 움직이도록 한다.

벡터에 저장되어있는 로봇들의 현재 인덱스를 확인하며 다음 칸으로 옮겨준다.

다음칸에 로봇이 없거나 내구도가 있을 때만 이동한다.

 

로봇이 움직인 후 down을 해야하는 칸에 로봇이 있다면 내려준다.

 

    public static void addRobot() {
        if (A[up] > 0) {
            isRobot[up] = true;
            robot.add(up);
            A[up]--;
            if (A[up] == 0) cnt++;
        }
        if (cnt < K) {
            level++;
            Rotate();
        }
    }

로봇을 추가 시켜준다. 올려야 하는 칸의 내구도가 있다면 로봇을 올려준다.

만약 내구도가 0인 칸이 K이상이면 끝, 아니라면 level을 올려주고 다시 Rotate함수로 돌아간다.

 

반응형

 

전체 코드

import java.util.Scanner;
import java.util.Vector;

public class Main {
    static int N, K, cnt = 0, level = 1;
    static int up, down;
    static int[] A;
    static Boolean[] isRobot;
    static Vector<Integer> robot = new Vector<Integer>();

    public static void Rotate() {
        up--;
        if (up < 0) up = 2 * N - 1;
        down--;
        if (down < 0) down = 2 * N - 1;
        if (isRobot[down] == true) {
            robot.remove(0);
            isRobot[down] = false;
        }
        moveRobot();
    }

    public static void moveRobot() {
        if (!robot.isEmpty()) {
            for (int i = 0; i < robot.size(); i++) {
                //로봇 이동 가능
                int nextLocation = (robot.get(i) + 1) % (2 * N);
                if (isRobot[nextLocation] == false && A[nextLocation] > 0) {
                    robot.set(i, nextLocation);
                    isRobot[nextLocation] = true;

                    if (nextLocation == 0)
                        isRobot[2 * N - 1] = false;
                    else
                        isRobot[nextLocation - 1] = false;

                    A[nextLocation]--;
                    if (A[nextLocation] == 0) cnt++;
                }
            }
        }

        if (isRobot[down] == true) {
            isRobot[down] = false;
            robot.remove(0);
        }
        addRobot();
    }

    public static void addRobot() {
        if (A[up] > 0) {
            isRobot[up] = true;
            robot.add(up);
            A[up]--;
            if (A[up] == 0) cnt++;
        }
        if (cnt < K) {
            level++;
            Rotate();
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        N = sc.nextInt();
        K = sc.nextInt();

        A = new int[2 * N];
        isRobot = new Boolean[2 * N];
        up = 0;
        down = N - 1;
        for (int i = 0; i < 2 * N; i++) {
            A[i] = sc.nextInt();
            isRobot[i] = false;
        }
        Rotate();
        System.out.println(level);
    }
}

728x90
반응형