Yeon DevLog

Algorithm

[백준/BOJ][JAVA] 20055 - 컨테이너 벨트 위의 로봇

devYeON_ 2021. 12. 8. 22:08

BOJ-20055 컨테이너 벨트 위의 로봇 문제 풀기

 

 

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

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

www.acmicpc.net

 

[문제]

일차원 배열을 2 * N + 1개를 받아 순환하며 단계별로 해결하는 문제였다.

어렵게 생각하지 않고, 이렇게

  1. 벨트가 한 칸 회전한다.
  2. 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.
    1. 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
  3. 올라가는 위치에 로봇이 없다면 로봇을 하나 올린다.
  4. 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.

주어진 단계를 함수로 빼고 이를 반복으로 돌려 단계의 count를 세면 풀 수 있는 문제다.

로봇이 올라갈 수 있는지를 확인하는 boolean 배열을 만들어 함께 돌리면서 내구성도 확인할 수 있었다.

 

[소스 코드]

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class boj20055_컨테이너벨트 {
    static int N, K;
    static int[] container;
    static boolean[] check;
    static int blank;
    static int result;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        N = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());

        container = new int[N * 2 + 1];
        check = new boolean[N * 2 + 1];
        blank = 0;
        result = 0;
        container[0] = 0;
        st = new StringTokenizer(br.readLine(), " ");
        for (int i = 1; i < N * 2 + 1; i++) {
            container[i] = Integer.parseInt(st.nextToken());
        }

        while (true) {
            ++result;
            moveContainer();
            stepBy();
            if (blank >= K)
                break;
        }

        System.out.println(result);
    }

    // 1.벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
    static void moveContainer() {
        container[0] = container[N * 2];
        check[0] = check[N * 2];
        for (int i = N * 2; i > 1; i--) {
            container[i] = container[i - 1];
            check[i] = check[i - 1];
        }
        container[1] = container[0];
        check[1] = check[0];

    }

    // 2. 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한칸 이동할 수 있으면 이동.
    // 내구도 1이상이어야함
    static void stepBy() {
        if (check[N] == true) {
            check[N] = false;
        }

        for (int i = N - 1; i > 0; i--) {
            if (check[i] == false)
                continue;
            if (container[i + 1] > 0 && check[i + 1] == false) {
                check[i] = false;
                check[i + 1] = true;
                if (--container[i + 1] == 0)
                    blank++;
            }
        }
        if (container[1] > 0 && check[1] == false) {
            check[1] = true;
            if (--container[1] == 0)
                blank++;
        }

        if (check[N] == true)
            check[N] = false;

    }
}

[리뷰]