길이 2N의 컨베이어 벨트 위에 로봇이 이동하며,
벨트의 내구도(durability) 가 0이 되는 칸이 K개 이상일 때까지 과정을 시뮬레이션하는 문제이다.
K 이상이면 종료한다.👉 출력 : 종료될 때까지의 단계 수
벨트와 로봇의 상태를 함께 회전
belt[])과 로봇 배열(robot[])을 한 칸씩 오른쪽으로 회전시킴.로봇 이동
로봇 올리기
내구도 0인 칸 세기
K 이상이면 종료.| 변수 | 설명 |
|---|---|
N | 벨트의 절반 길이 |
K | 내구도 0인 칸의 임계값 |
belt[] | 벨트 각 칸의 내구도 |
robot[] | 로봇 존재 여부 (true면 로봇 존재) |
step | 현재 단계 수 |
zeroCnt | 내구도 0인 칸 개수 |
belt 배열(길이 2N)과 robot 배열(길이 N) 초기화 step) 출력 
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt(); // 벨트 위 칸 수 (한쪽)
int K = sc.nextInt(); // 내구도가 0인 칸이 K개 이상이면 종료
int size = 2 * N; // 벨트 전체 길이
int[] belt = new int[size];
for (int i = 0; i < size; i++) {
belt[i] = sc.nextInt();
}
boolean[] robot = new boolean[N]; // 로봇 위치 관리 (0~N-1까지만)
int zeroCnt = 0;
int step = 0;
while (true) {
step++;
// 1️⃣ 벨트 회전
int last = belt[size - 1];
for (int i = size - 1; i > 0; i--) {
belt[i] = belt[i - 1];
}
belt[0] = last;
// 로봇 회전
for (int i = N - 1; i > 0; i--) {
robot[i] = robot[i - 1];
}
robot[0] = false; // 올라가는 위치에는 회전 시 로봇 없음
robot[N - 1] = false; // 내리는 위치 로봇 내림
// 2️⃣ 로봇 이동
for (int i = N - 2; i >= 0; i--) {
if (robot[i] && !robot[i + 1] && belt[i + 1] > 0) {
robot[i] = false;
robot[i + 1] = true;
belt[i + 1]--;
}
}
robot[N - 1] = false; // 내리는 위치 로봇 내림
// 3️⃣ 올라가는 위치에 로봇 올리기
if (belt[0] > 0 && !robot[0]) {
robot[0] = true;
belt[0]--;
}
// 4️⃣ 내구도 0 칸 개수 세기
zeroCnt = 0;
for (int durability : belt) {
if (durability == 0) zeroCnt++;
}
// 5️⃣ 종료 조건
if (zeroCnt >= K) break;
}
System.out.println(step);
sc.close();
}
}
int last = belt[size - 1];
for (int i = size - 1; i > 0; i--) {
belt[i] = belt[i - 1];
}
belt[0] = last;
for (int i = N - 1; i > 0; i--) {
robot[i] = robot[i - 1];
}
robot[0] = false;
robot[N - 1] = false;
for (int i = N - 2; i >= 0; i--) {
if (robot[i] && !robot[i + 1] && belt[i + 1] > 0) {
robot[i] = false;
robot[i + 1] = true;
belt[i + 1]--;
}
}
if (belt[0] > 0 && !robot[0]) {
robot[0] = true;
belt[0]--;
}
if (zeroCnt >= K) break;