/ BOJ

BOJ_20055_컨베이어벨트위의로봇_JAVA

문제 : 컨베이어벨트 위의 로봇

링크 : BOJ_20055_컨베이어벨트 위의 로봇

접근 방식

문제에 적혀있는 대로 로직을 짜면 되는 문제였다. 나는 2차원 배열을 통해 순환구조를 구현했다.

  1. 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.

  2. 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.

  3. 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다. 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.

  4. 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.

1번부터 4번까지 한 번 수행하는 것을 1단계로 하여 각 단계를 구현하였다. 각 번호는 소스코드에 주석으로 달아두었다.

소스 코드

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

public class BOJ_20055_컨베이어벨트위의로봇 {
	static int N;

	public static void main(String[] args) throws NumberFormatException, IOException {

		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

		StringTokenizer st = new StringTokenizer(in.readLine(), " ");

		N = Integer.parseInt(st.nextToken());

		int K = Integer.parseInt(st.nextToken());

		int arr[][] = new int[2][N];
		boolean robot[] = new boolean[N];

		st = new StringTokenizer(in.readLine(), " ");

		for (int i = 0; i < N; i++) {
			arr[0][i] = Integer.parseInt(st.nextToken());
		}
		for (int i = N - 1; i >= 0; i--) {
			arr[1][i] = Integer.parseInt(st.nextToken());
		}
		int answer =0;
		while (true) {
			answer++;
			// 1. 컨베이어벨트 회전
			rotate(arr,robot);

			// 2. 로봇 이동
			for (int i = N-2; i >=0; i--) {
				if (robot[i]) {
					// 로봇이 끝점이면 false
					if (i == N - 1) {
						robot[i] = false;
						continue;
					}
					// 로봇 앞이 막혀있지 않고 해당 칸의 내구도가 1이상이라면
					if (!robot[i + 1] && arr[0][i + 1] >= 1) {
						// 내구도 1 감소
						arr[0][i + 1]--;
						robot[i] = false;
						robot[i + 1] = true;
						// 이동한 위치가 끝점이면 내린다.
						if (i + 1 == N - 1) {
							robot[i + 1] = false;
						}
					}

				}
			}

			// 3. 로봇 올리기
			if (arr[0][0] >= 1) {
				arr[0][0]--;
				robot[0] = true;
			}
			int cnt = 0;
			// 4. K 체크
			for (int i = 0; i < 2; i++) {
				for (int j = 0; j < N; j++) {
					if (arr[i][j] == 0) {
						cnt++;
					}
				}
			}

//			System.out.println(answer+"회");
//			for(int i=0;i<2;i++) {
//				System.out.println(Arrays.toString(arr[i]));
//			}


			if (cnt >= K) {
				break;
			}
		}
		System.out.println(answer);
	}

	public static void rotate(int[][] arr, boolean[] robot) {

		int temp = arr[1][0];

		for (int i = 1; i < N; i++) {
			arr[1][i - 1] = arr[1][i];
		}

		arr[1][N - 1] = arr[0][N - 1];

		for (int i = N - 1; i > 0; i--) {
			arr[0][i] = arr[0][i - 1];
		}

		// 로봇 옮기기
		for(int i=N-2;i>=0;i--) {
			 robot[i+1] = robot[i];
			 robot[i] = false;
			 if(i+1 == N-1) {
				 robot[i+1] = false;
			 }
		}

		arr[0][0] = temp;

	}

}