Jun's Development Journey

[BOJ] 20055번 컨베이어 벨트 위의 로봇 본문

BOJ/Implement

[BOJ] 20055번 컨베이어 벨트 위의 로봇

J_Jayce 2021. 4. 15. 19:47

문제

www.acmicpc.net/problem/20055

 

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

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

www.acmicpc.net

풀이

중요한점

1) 로봇이 밑에 달려서 가는게 아니다.

2) 올라가는 점은 무조건 비워있어야하고, 내려가는 점의 로봇도 땅으로 내려야한다.

3) 컨베이어 벨트가 움직일 때 로봇도 움직이니 각각 배열을 만들어 둘다 움직여줘야한다.

=> 그렇게 어려운 문제는 아니었는데 문제를 이해하는데 너무 많은 시간을 쏟은 문제였다.

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*;
import java.util.StringTokenizer;
import java.util.Map.*;

public class BOJ_20055 {

    static boolean isPossible(int[] remain, int K){
        int cnt=0;
        for(int i=0;i<remain.length;i++){
            if(remain[i]==0)
                cnt++;
            if(cnt==K)
                return false;
        }
        return true;
    }
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        int[] remain = new int[2*N];
        boolean[] robot= new boolean[N];
        int level=0;
        st = new StringTokenizer(br.readLine());
        for(int i=0;i<2*N;i++)
            remain[i] = Integer.parseInt(st.nextToken());

        //1번 : 올라가는 위치, N번 : 내려가는 위치
        //로봇이 어떤 칸에 올라가거나 이동하면 내구도 1 감소
        //내구도 0 칸에 로봇 올라갈 수 없다.
        while(isPossible(remain,K)){
            int tmp = remain[2*N-1];
            //벨트 회전
            for(int i=2*N-1;i>0;i--)
                remain[i] = remain[i-1];
            remain[0] = tmp;
            //로봇 회전
            for(int i=N-1;i>0;i--)
                robot[i] = robot[i-1];
            robot[0] = false;
            //끝 로봇 내리기
            robot[N-1] = false;
            //로봇 이동
            for(int i=N-1;i>0;i--){
                if(robot[i-1] && !robot[i] && remain[i]>=1){
                    robot[i] = robot[i-1];
                    robot[i-1] = false;
                    robot[i] = true;
                    remain[i]--;
                }
            }
            //올라가는 위치 로봇 올리기
            if(!robot[0] && remain[0]>=1){
                robot[0] = true;
                remain[0]--;
            }
            level++;
        }
        System.out.println(level);
    }
}

'BOJ > Implement' 카테고리의 다른 글

[BOJ] 13458번 시험 감독  (0) 2021.05.26
[BOJ] 3985번 롤 케이크  (0) 2021.05.25
[BOJ] 17827번 달팽이 리스트  (0) 2021.05.12