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

like0·2022년 9월 8일
0

코테준비(JAVA)

목록 보기
37/37

생각 정리

각 단계별로 함수를 만들었다.

  1. rotate() - 벨트와 로봇이 함께 한 칸 회전하는 함수
  • 로봇이 내리는 칸에 이르렀다면 내리기
  1. robotsMove()
    가장먼저 벨트에 올라간 로봇부터(=내리는 위치, N-1에서부터)
    if (이동하고자 하는 칸에 로봇이 없고 && 내구도가 1 이상)이라면 로봇을 이동한다.
  • 이동된 자리에 로봇이 생기고, 원래 있던 자리에는 로봇 없애주기
  • 로봇 이동시키고 해당 자리의 내구도 감소시켜주기
  • 로봇이 내리는 칸에 이르렀다면 내리기
  1. enterNewRobot()
    올리는 칸의 내구도가 0이 아니면(= 1 이상이면) 로봇 올림
    (로봇 올리고 올리는 칸의 내구도 감소시켜주기)
  1. boolean isExit()
    내구도가 0인 칸의 개수가 K개 이상이라면 true, 그렇지 않다면 false를 리턴시켜주기

코드

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

public class Main {
    static int N, K;
    static int[] arr;
    static int[] robot; //0: 로봇 존재 x, 1: 로봇 존재
    public static void main(String[] args) throws IOException{
        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];
        robot = new int[N];
        st = new StringTokenizer(br.readLine());
        for(int i=0; i<2*N; i++)
            arr[i] = Integer.parseInt(st.nextToken());

        int stage = 1;
        while(true) {
            //1단계 회전하기
            rotate();
            //2단계 맨 앞의 로봇부터 (N-1에 가까울수록 먼저들어간 것임) 벨트가 이동한 방향으로 이동할 수 있으면 이동
            robotsMove();

            enterNewRobot();

            if(isExit()) break;
            else stage++;
        }

        System.out.println(stage);
        
    }

    static void rotate() { //컨베이어벨트 위의 로봇도 회전시켜주어야 함 
        int start = arr[2*N-1];
        for(int i=2*N-2; i>=0; i--) {
            arr[i+1] = arr[i];
        }
        arr[0] = start;

        for(int i=N-2; i>=0; i--) {
            robot[i+1] = robot[i];
            if(i+1 == N-1) //로봇이 내리는 위치에 도달하면 그 즉시 내림
                robot[i+1] = 0; //로봇이 내렸으니 0으로 바꿔준다 
        }
        robot[0] = 0;

    }

    static void robotsMove() {
        int n = N-2;
        while(n > 0) {
            if(robot[n] == 1 && robot[n+1] == 0 && arr[n+1] >= 1) { //앞에서부터 로봇이 있을 때, 이동하고자 하는 칸에 로봇 없음 && 내구도가 1 이상임
                robot[n+1] = 1; //로봇을 옮김 
                if(n+1 == N-1) //로봇이 내리는 위치에 도달하면 그 즉시 내림
                    robot[n+1] = 0; //로봇이 내렸으니 0으로 바꿔준다 
                robot[n] = 0; //로봇이 ㅇㅣ동했으니 원래 있던 곳에는 없어짐
                arr[n+1]--; //내구도 1감소
            }
            n--;
        }
    }

    static void enterNewRobot() {
        if(arr[0] >= 1){ //올리는 위치에 있는 칸의 내구도가 0이 아니면
            robot[0] = 1; //올리는 위치에 로봇을 올린다.
            arr[0]--; //로봇을 올리는 위치에 올리거나 ..~ 하면 그 칸의 내구도는 즉시 1만큼 감소한다.
        }
    }

    static boolean isExit() {
        int cnt = 0;
        for(int a: arr)
            if(a == 0) cnt++; //내구도가 0이라면 증가 

        if(cnt >= K) return true; //내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다.
        else return false; //그렇지 않다면 1번으로 돌아간다.
    }
}
profile
배우고 성장하는 개발자가 되기!

0개의 댓글