Algorithm/baekjoon

컨베이어 벨트 위의 로봇

마닐라 2022. 2. 23. 14:10

📍 문제 설명

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

 

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

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

www.acmicpc.net

 

💡 접근

문제에서 주어진 순서대로 구현하면 되는 시뮬레이션 문제였다.

벨트와 로봇이 회전할 때 로봇이 움직이는게 아닌 벨트가 움직여서 따라가는 거라 내구도의 변화가 없다.

이 부분에서 실수를 해서 시간이 꽤 오래걸렸다.

 

 

👩‍💻 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int s, n, m = 1, v, e, k, r, x, y, answer, cnt;
    static int[] arr, dice;
    static long[] dp;
    static int[][] boardA, boardB;
    static boolean[] visited;
    static int[] dx = {1,0,-1,0};
    static int[] dy = {0,-1,0,1};
    static ArrayList<Integer> list;
    static StringBuilder sb;
    static Queue<Integer> q;
    public static void main(String[] args) throws IOException {
        Main T = new Main();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());

        arr = new int[2*n];
        //로봇이 있는지 확인하는 배열
        visited = new boolean[n];
        st = new StringTokenizer(br.readLine());
        for(int i = 0; i < arr.length; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        System.out.println(T.solution());

    }

    private int solution() {
        while (true) {
            //1.벨트 회전 시키기
            int temp = arr[arr.length - 1];
            for (int i = arr.length - 1; i >= 1; i--) {
                arr[i] = arr[i - 1];
            }
            //첫 지점은 마지막 값
            arr[0] = temp;

            //1.로봇도 함께 회전시키기
            for (int i = visited.length-1; i >= 1; i--) {
                visited[i] = visited[i-1];
            }
            //회전했으니 첫 칸엔 로봇이 없다.
            visited[0] = false;

            //2.로봇 이동시키기()
            visited[n-1] = false;
            for (int i = n-1; i > 0; i--) {
                //현재 칸에 로봇이 없고 이전 칸에 로봇이 있으며 내구도가 1이상이면 현재 칸으로 로봇 이동시키기
                if (!visited[i] && visited[i-1] && arr[i] >= 1) {
                    visited[i] = true;
                    visited[i-1] = false;
                    //현재 위치 내구도 감소
                    arr[i]--;
                }
            }

            //3.올리는 위치에 로봇 올리기
            if (arr[0] > 0 && !visited[0]) {
                visited[0] = true;
                arr[0]--;
            }

            cnt = 0;
            for (int i = 0; i < arr.length; i++) {
                if (arr[i] == 0) cnt++;
            }

            if (cnt >= k) break;

            //단계 증가
            m++;
        }
        return m;
    }

    private static class Point {
        private int x;
        private int y;

        public Point(int x, int y) {
            this.x = x;
            this.y = y;
        }

        @Override
        public String toString() {
            return "Point{" +
                    "x=" + x +
                    ", y=" + y +
                    '}';
        }
    }
}

'Algorithm > baekjoon' 카테고리의 다른 글

에너지 모으기  (0) 2022.02.24
두 동전  (0) 2022.02.23
드래곤커브  (0) 2022.02.21
주사위 굴리기  (0) 2022.02.21
배열 돌리기 1  (0) 2022.02.21