BOJ_20055_컨베이어벨트위의로봇_JAVA
문제 : 컨베이어벨트 위의 로봇
접근 방식
문제에 적혀있는 대로 로직을 짜면 되는 문제였다. 나는 2차원 배열을 통해 순환구조를 구현했다.
-
벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
-
가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.
-
로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다. 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
-
내구도가 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;
}
}