본문 바로가기

Algorithm/문제

[백준 / JAVA] 20055. 컨베이어 벨트 위의 로봇 (G5)

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

 

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

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

www.acmicpc.net

 

구현은 쉬운데 국어가 어려워서 코드의 해설이 아닌 지문의 해설을 보고 겨우 풀었다. 지문을 나름대로 풀어 쓰자면

 

□ 단계 시작

- 벨트가 1칸 회전한 후 N번 칸(0부터 시작하면 N-1)의 로봇을 내린다.(내릴 때는 내구도 소모 X)

- 벨트 위의 로봇들이 앞 칸으로 전진할 수 있을 경우(앞 칸에 로봇이 없고 내구도가 있을 때) 전진한다.

(문제에서 이 부분을 너무 개떡같이 적어놨다고 생각해요...)

- 1번 칸에 로봇을 올릴 수 있다면(내구도가 있다면) 로봇을 올린다.

■ 단계 끝

 

로봇 이동 단계에서 인덱스 조회가 많이 일어나서 ArrayList를 사용했는데, 풀이를 찾아보니 Deque에 인덱스로 접근이 가능한 언어도 존재하는 것 같다.

 

구현 시간*5 = 문제 이해시간

 

import java.util.*;
import java.io.*;

public class Main {
	static BufferedReader br;
	static StringTokenizer st;
	static StringBuilder sb;

	public static void main(String[] args) throws Exception {
		br = new BufferedReader(new InputStreamReader(System.in));
		sb = new StringBuilder();
		st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());
		beltList = new ArrayList<Belt>();
		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < 2 * N; i++)
			beltList.add(new Belt(Integer.parseInt(st.nextToken()), false));
		while (true) {
			stage++;
			rotate();
			move();
			add();
			if (K < 1)
				break;
		}
		System.out.println(stage);
	}

	static int N, K, stage = 0;
	static ArrayList<Belt> beltList;

	static void add() {
		if (beltList.get(0).durability > 0) {
			beltList.get(0).robot = true;
			if (--beltList.get(0).durability == 0)
				K--;
		}
	}

	static void move() {
		for (int i = N - 2; i >= 0; i--) {
			if (beltList.get(i).robot && !beltList.get(i + 1).robot && beltList.get(i + 1).durability > 0) {
				beltList.get(i).robot = false;
				beltList.get(i + 1).robot = true;
				if (--beltList.get(i + 1).durability == 0)
					K--;
			}
			if (beltList.get(N - 1).robot)
				beltList.get(N - 1).robot = false;
		}
	}

	static void rotate() {
		beltList.add(0, beltList.get(beltList.size() - 1));
		beltList.remove(beltList.size() - 1);
		if (beltList.get(N - 1).robot)
			beltList.get(N - 1).robot = false;
	}

	static class Belt {
		int durability;
		boolean robot;

		public Belt(int durability, boolean robot) {
			super();
			this.durability = durability;
			this.robot = robot;
		}
	}
}