BOJ 20055: 컨베이어 벨트 위의 로봇 https://www.acmicpc.net/problem/20055
올리는 위치(belt[0])
에만 올릴 수 있다. 언제든지 로봇이 내리는 위치(belt[N-1])
에 도달하면 그 즉시 내린다.import java.util.*;
import java.io.*;
public class Main {
static int N, K;
static int[] belt;
static boolean[] robot;
static int phase;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
belt = new int[2 * N];
robot = new boolean[N]; // 로봇은 윗 줄에만 있음
// 벨트의 내구도를 배열에 넣음
st = new StringTokenizer(br.readLine(), " ");
for(int i=0; i<belt.length; i++) {
belt[i] = Integer.parseInt(st.nextToken());
}
phase = 0; // 출력할 단계
while(!isEnd()) {
// 벨트 1칸 회전
int temp = belt[belt.length - 1];
for(int i=belt.length - 1; i>0; i--) {
belt[i] = belt[i-1];
}
belt[0] = temp;
// 벨트 위에 있는 로봇도 1칸 이동
for(int i=robot.length - 1; i>0; i--) {
robot[i] = robot[i-1];
}
robot[0] = false; // 입구 칸에 있떤 로봇은 다음 칸으로 이동했음
robot[N-1] = false; // 출구 칸에 있는 로봇은 제거
// 로봇 1칸 갈 수 있으면 이동
for(int i=N-1; i>0; i--) {
// 이동할 로봇이 있으면 && 다음 칸에 로봇이 없으면 && 다음 칸의 내구도가 0보다 크면
if(robot[i-1] && !robot[i] && belt[i]>0) {
robot[i] = true;
robot[i-1] = false;
belt[i]--;
}
}
// 입구에 로봇 새로 올림
if(belt[0] > 0) {
robot[0] = true;
belt[0]--;
}
// 단계 +1
phase++;
}
System.out.println(phase);
}
// 단계를 끝낼 수 있으면 true 반환
static boolean isEnd() {
int cnt = 0;
for(int i=0; i<2*N; i++) {
if(belt[i] <= 0) {
cnt++;
}
// 내구도가 0 이하인 벨트가 K개 이상이면 true
if(cnt >= K) {
return true;
}
}
return false;
}
}