문제 링크는 여기.
문제에서 주어진 조건대로 코드를 짜면 되는 것이었다.
처음 짤 때는 왜 중간에 혼자 변형해서 코드를 작성했는지 모르겠다…
종료되었을 때 몇 번째 단계가 진행 중이었는지 구해보자. 가장 처음 수행되는 단계는 1번째 단계이다.
// 로봇 추가 위치
int input = 0;
// 로봇 제거 위치
int output = N/2-1;
// 시도 횟수
int ans = 1;
// 빈칸
int blank = 0;
while(true) {
// 한칸 회전
input = (input+N-1)%N;
output = (output+N-1)%N;
// 제거 위치에 있으면 일단 삭제
robot[output] = false;
// 로봇 먼저 둔 순서대로 이동 시도
for(int i=1; i<N/2; i++) {
int n = (output+N-i)%N;
int m = (n+1)%N;
// 옮길 로봇이 있고
if(robot[n]) {
// 앞에 로봇이 없으며 벨트 내구도가 남아있다면
if(!robot[m] && balt[m]>0) {
robot[n] = false;
belt[m]--;
// 내구도 바닥나면 표시
if(belt[m]==0) blank++;
// 탈출구 아니면 전진
if(output!=m)
robot[m] = true;
}
}
}
// 벨트에 로봇 올릴 수 있으면 올리기
if(belt[input]>0) {
robot[input] = true;
belt[input]--;
// 내구도 바닥나면 표시
if(balt[input]==0) blank++;
}
if(blank>=K) break;
ans++;
}
최종 제출한 코드는 다음과 같다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken())*2;
int K = Integer.parseInt(st.nextToken());
int[] belt = new int[N];
boolean[] robot = new boolean[N];
st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++) {
belt[i] = Integer.parseInt(st.nextToken());
}
int input = 0;
int output = N/2-1;
int ans = 1;
int blank = 0;
while(true) {
// 한칸 회전
input = (input+N-1)%N;
output = (output+N-1)%N;
robot[output] = false;
for(int i=1; i<N/2; i++) {
int n = (output+N-i)%N;
int m = (n+1)%N;
// 옮길 로봇이 있고
if(robot[n]) {
// 앞에 로봇이 없으며 벨트 내구도가 남아있다면
if(!robot[m] && belt[m]>0) {
robot[n] = false;
belt[m]--;
// 내구도 바닥나면 표시
if(belt[m]==0) blank++;
// 탈출구 아니면 전진
if(output!=m)
robot[m] = true;
}
}
}
// 벨트에 로봇 올릴 수 있으면 올리기
if(belt[input]>0) {
robot[input] = true;
belt[input]--;
// 내구도 바닥나면 표시
if(belt[input]==0) blank++;
}
if(blank>=K) break;
ans++;
}
System.out.println(ans);
}
}

문제 지문을… 잘 읽자…^^