알고리즘/알고리즘문풀

BOJ - 컨베이어 벨트 위의 로봇 20055번 (JAVA)

developer-ellen 2022. 4. 30. 13:50

❓ 문제 - 백준 컨베이어 벨트 위의 로봇 20055번 - JAVA 풀이법

 

출처 

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

 

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

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

www.acmicpc.net

 

 

📝 문제해결법

1. 이 문제는 구현으로 풀었다.

  • ArrayList를 활용해서 벨트의 각 칸에 남은 내구도를 관리하며, robot의 배열로 0~n-1칸에 있는 로봇이 있는지 없는지를 체크해준다.
  • while을 통해 내구도가 0인 칸의 개수가 k개 이상인지 매번 체크하면서 조건에 순서에 맞춰 컨베이어벨트를 돌린다.
  • 처음에 컨베이어벨트가 한 칸 이동 처리해주고, 해당 컨베이어벨트가 한 칸씩 움직이면 로봇도 동시에 움직이므로 한칸씩 이동 처리 해준다. 그리고 n-1에 위치에서는 항상 로봇이 내리므로 로봇이 내림처리 해준다.
  • 그 다음 로봇의 이동이 이뤄지는데 n-1 ~ 1까지 현재 칸에서 로봇이 없는 상태에서 옆에 로봇이 존재한다면 현재 칸의 내구도가 1이상인지 체크한 후 나의 칸으로 로봇을 이동시켜준다.
  • 그리고 로봇을 이동처리 했을 순간에 내구도가 0으로 된 각 칸의 수를 cnt로 카운트 해준다. 
  • 그 뒤에 올리는 위치(0)에 내구도가 1이상인지 체크해서 1이상이라면 로봇을 올릴 수 있다. 그리고 아까와 같이 로봇을 올린 순간에 내구도가 0이되면 cnt을 1증가시켜준다.
  • 로봇을 옮기는 과정까지 다 처리한 후 내구도 0인게 k개 이상이라면 break를 통해 컨베이어벨트의 이동을 중지한다.

 

💻 소스코드

// BOJ - 컨베이어 벨트 위의 로봇 (20055번)
// 구현

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

public class Main_20055 {
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int n = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());
		ArrayList<Integer> power = new ArrayList<>();
		boolean[] robot = new boolean[n];
	

		st = new StringTokenizer(br.readLine(), " ");
		for(int i=0;i<2*n;i++) {
			power.add(Integer.parseInt(st.nextToken()));
			
		}
	
		int time = 1;
		int cnt = 0;
		while(true) {
			// 컨베이어 벨트 한칸  이동
		
			int last = power.get(2*n-1);
			power.remove(2*n-1);
			power.add(0, last);
		
			// 로봇 같이 한칸 이동
			for(int i=n-1;i>=1;i--) {
				robot[i] = robot[i-1];
			}
			robot[n-1] = false;
			robot[0] = false;
		
			// 로봇의 이동
			for(int i=n-1;i>=1;i--) {
			
				int p = power.get(i);
				if(p > 0 && !robot[i] && robot[i-1]) {
					robot[i] = true;
					power.set(i, p-1);
					robot[i-1] = false;
					if(p-1 == 0) {
						cnt++;
					}
				}
			}

			
			int first_p = power.get(0);
			if(first_p > 0) {
				power.set(0, first_p-1);
				robot[0] = true;
				if(first_p == 1) {
					cnt++;
				}
			}
			
			if(cnt >= k) {
				break;
			}

			time++;
		}
		System.out.println(time);
		

	}
	
	public static void print(boolean[] arr) {
		for(int i=0;i<arr.length;i++) {
			System.out.print(arr[i]?'t':'f');
			System.out.print(" ");
		}
		System.out.println();
	}

}