Today's special moments become memories of tomorrow.

BOJ/삼성 SW 역량테스트

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

lotus lee 2021. 4. 21. 21:15

 

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

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

www.acmicpc.net

int[] A = new int[2*N+1] : 칸 별로 내구도를 의미

 

int[][] num = new int[2][N+1] : 각 위치에 무슨 번호의 칸이 있는지를 의미

컨테이너 벨트의 가장 왼쪽 위가 [0][1], 가장 오른쪽 위가 [0][N], 가장 왼쪽 아래가 [1][1], 가장 오른쪽 아래가 [1][N] 위치를 의미한다.

 

처음에는 num[0][1] = 1번 칸, num[0][2] = 2번 칸, ... num[0][N]= N번 칸 ... num[1][1] = 2*N번 칸이 된다.

 

       

boolean[][] robot = new boolean[2][N+1] : 해당 위치에 로봇이 존재하면 true, 존재하지 않으면 false

 

 

 

1. moveBelt() : 벨트가 한 칸 회전한다.

	public static void moveBelt() {

		int tmp = num[1][1];

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

		num[1][N] = num[0][N];

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

		num[0][1] = tmp;

		robot[0][1] = false;
		robot[0][N] = false;

	}

 

2. moveRobot() : 로봇이 한 칸씩 이동한다. 단, 이동할 위치의 내구도가 0보다 크고, 로봇이 없어야 한다.

로봇이 "내려가는 곳"인 [0][N] 위치는 로봇이 이동하자마자 내려가야 하므로, 마지막에 항상

robot[0][N] = false로 바꿔준다. (로봇이 머물러 있을 수 없음)

	public static void moveRobot() {

		for (int i = N - 1; i >= 1; i--) {

			if (robot[0][i] && !robot[0][i + 1] && A[num[0][i + 1]] > 0) {
				robot[0][i] = false;
				robot[0][i + 1] = true;
				A[num[0][i + 1]]--; // 내구도 감소
			}
		}

		robot[0][N] = false;

	}

 

3. loadRobot() : "올라가는 곳" [0][1] 위치에 새로운 로봇을 올린다. 단, 내구성이 0보다 커야 한다.

마찬가지로, 로봇이 "내려가는 곳"인 [0][N] 위치는 로봇이 이동하자마자 내려가야 하므로, 마지막에 항상

robot[0][N] = false로 바꿔준다. (로봇이 머물러 있을 수 없음)

	public static void moveRobot() {

		for (int i = N - 1; i >= 1; i--) {

			if (robot[0][i] && !robot[0][i + 1] && A[num[0][i + 1]] > 0) {
				robot[0][i] = false;
				robot[0][i + 1] = true;
				A[num[0][i + 1]]--; // 내구도 감소
			}
		}

		robot[0][N] = false;

	}

 

 

전체 코드 :