ALGORITHM

백준 20055 컨베이어 벨트 위의 로봇 (Java)

공부하는_다온 2023. 4. 20. 23:19

1. 문제 링크

 

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

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

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

  1. 내구성과 로봇의 유무를 링크드리스트로 관리했다.
  2. 내구도 0인 칸이 K개가 될 때까지 3 함수를 반복한다.
  3. 함수1은 내구도와 로봇 리스트의 마지막을 꺼내 처음에 넣는다.
  4. 함수2는 움직일 수 있는 로봇이면 한 칸 씩 옮기고 리스트 내용을 수정한다.
  5. 올리는 위치에 로봇 유무를 확인하고 로봇을 추가한다.

 

4. 코드

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

public class Main {
	static int N, broken;
	static LinkedList<Integer> power = new LinkedList<>();
	static LinkedList<Boolean> robot = new LinkedList<>();
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] split = br.readLine().split(" ");
		N = Integer.parseInt(split[0]);
		int K = Integer.parseInt(split[1]);
		split = br.readLine().split(" ");
		int temp;
		for(int i=0;i<2*N;i++) {
			temp = Integer.parseInt(split[i]);
			power.offer(temp);
			robot.offer(false);
		}
		broken = 0;
		int count = 0;
		while(broken<K) {
			count++;
			function1();
			function2();
			function3();
		}
		System.out.println(count);
	}
	private static void function1() {
		power.offerFirst(power.pollLast());
		robot.offerFirst(robot.pollLast());
		robot.set(N-1, false);
	}
	private static void function2() {
		for(int i = N-2; i>=0;i--) {
			if(robot.get(i) && !robot.get(i+1) && power.get(i+1) != 0) { 
				robot.set(i, false);
				robot.set(i+1, true);
				power.set(i+1, power.get(i+1) - 1);
				if(power.get(i+1) == 0) {
					broken++;
				}
			}
		}
		robot.set(N-1, false);
	}
	private static void function3() {
		if(!robot.get(0) && power.get(0) != 0) {
			robot.set(0, true);
			power.set(0, power.get(0)-1);
			if(power.get(0) == 0) {
				broken++;
			}
		}
	}
}