본문 바로가기

알고리즘 공부 및 문제 풀이/백준(BOJ)

[boj] 백준 20055 컨베이어 벨트 위의 로봇 (Java) - 시뮬레이션

[문제]

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

 

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

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

www.acmicpc.net

 

[풀이]

단순 시뮬레이션. 하라는 순서대로 구현하면 된다. 딱히 설명할 게 없다..

편의를 위해 컨베이어 벨트 내구도를 저장하는 배열과 로봇 위치를 저장하는 배열을 따로 뒀는데 컨베이어 벨트 회전할 때 로봇 위치도 변경하는 거 잊지 않도록 주의!

 

[코드]

 

package 시뮬레이션;
import java.io.*;
import java.util.*;

public class boj_20055_java {
    static int n, k;
    static int[] belt;
    static boolean[] robot;
    static int cnt;
    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());

        belt = new int[2*n+1]; //컨베이어 벨트 내구도 저장
        st = new StringTokenizer(br.readLine());
        for(int i=1; i<=2*n; i++){
            belt[i] = Integer.parseInt(st.nextToken());
        }

        //내구도가 0인 칸의 개수가 k 이상이라면 종료
        cnt = 0;
        int level = 0;
        robot = new boolean[2*n+1]; //로봇 위치
        while(cnt < k){
            level++;
            
            //컨테이너벨트 한 칸 회전
            rotateBelt();

            //가장 먼저 올라간 로봇부터 이동할 수 있다면 한 칸 이동 -> 내구도 1 감소
            moveRobot();

            //1번 위치에서 로봇이 올라갈 수 있다면 올라감 -> 내구도 1 감소
            if(belt[1]>=1 && !robot[1]){
                robot[1] = true;
                belt[1]--;
                if(belt[1]==0) cnt++;
            }
        }

        System.out.println(level);
    }

    public static void moveRobot(){
        //내구도가 1이상, 다른 로봇이 없음
        for(int i=n-1; i>=1; i--){
            if(!robot[i]) continue;
            if(belt[i+1]>=1 && !robot[i+1]){
                robot[i+1] = true;
                robot[i] = false; //로봇 이동
                belt[i+1]--; //내구도 감소
                if(belt[i+1]==0) cnt++;
            }
        }

        //n에 위치한 로봇 내리기
        if(robot[n]) robot[n] = false;
    }
    
    public static void rotateBelt(){
        int temp = belt[2*n];
        for(int i=2*n-1; i>=1; i--){
            belt[i+1] = belt[i];
        }
        belt[1] = temp;

        //로봇 위치 배열도 회전
        boolean tempR = robot[n];
        for(int i=n-1; i>=1; i--){
            robot[i+1] = robot[i];
        }
        robot[1] = tempR;

        //n에 위치한 로봇 내리기
        if(robot[n]) robot[n] = false;

    }
}