[백준] 20055번 컨베이어 벨트 위의 로봇 (java, 구현)

728x90
반응형

www.acmicpc.net/problem/20055

 

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

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

www.acmicpc.net

import java.util.ArrayList;
import java.util.Scanner;


public class Main {

	static int n,k;
	static int[] belt;
	static ArrayList<Integer> list=new ArrayList<>();
	static boolean[] pos;
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		n=sc.nextInt();// 길이 컨베이어 길이는 2n
		k=sc.nextInt();
		belt=new int[2*n];
		pos=new boolean[2*n];
		for (int i = 0; i < 2*n; i++) {
			belt[i]=sc.nextInt();
		}
		
		for (int i = 0; i < 2*n; i++) {
			list.add(i);
		}
		int time=1;
		int cnt=0;
		
		while(true) {
//			1번 한 칸 회전
			int cur=list.get(list.size()-1);
			list.remove(list.size()-1);
			list.add(0, cur);
			int up=list.get(0); //타는 곳
			int down=list.get(n-1); //내리는 곳
            
			//내릴 로봇은 내리기
			if(pos[down]) {//회전 시켰을 때 내릴 위치에 온 로봇 내림
				pos[down]=false;
			}
			//로봇 스스로 이동
			for (int i = n-1; i >=0; i--) {
				int idx=list.get(i);
				int next=list.get(i+1);
				if(pos[idx]==true && belt[next]>=1 && pos[next]==false) {
					belt[next]-=1;
					pos[next]=true;
					pos[idx]=false;
					if(belt[next]==0)cnt++;
				}
			}
			//내릴 로봇은 내리기
			if(pos[down]) {
				pos[down]=false;
			}
			
			//로봇 올리기
			if(belt[up]>=1 && pos[up]==false) {
				pos[up]=true;
				belt[up]-=1;
				if(belt[up]==0)cnt++;
			}	

			if(cnt>=k)break;
			time++;
			
		}

		System.out.println(time);
	}
}
728x90
반응형
TAGS.

Comments