BOJ/삼성 SW 역량테스트
[백준 20055번] 컨베이어 벨트 위의 로봇 (java)
lotus lee
2021. 4. 21. 21:15
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;
}
전체 코드 :