문제 링크 ▶︎ 컨베이어 벨트 위의 로봇
문제가 이해하기 힘들게 설명되어 있지만, 결론은 컨베이어 벨트는 1-2n까지 한칸씩 이동하는 것이고 로봇은 1-n까지만 이동하고 n에서 내린다. 그리고 로봇이 존재하는 칸은 내구도가 하나씩 감소하는 것이 중요하고 다음 칸에 로봇이 있다면 이동하지 않는다. 그래서 한칸씩 이동하는 것을 쉽게 구현하기 위해서 리스트를 통해서 rotate하는 것을 선택했고, 로봇도 무조건 한칸에 하나까지만 올라갈 수 있으니까 boolean으로 표현하면 된다.
리스트 arr은 컨베이어 벨트를 의미하고 리스트 robot은 로봇이 어느 칸에 존재하는가를 의미한다. 그리고 answer은 몇번째 단계인가, zero는 내구도가 0인 컨베이어 벨트가 몇개인가를 의미한다.
반복문을 돌면서 우선 컨베이어 벨트가 시계방향으로 회전하므로 rotate 메서드를 통해서 컨베이어 벨트와 로봇을 모두 돌린다. 그리고 n-1번째에 로봇이 있다면 즉시 내려준다.
그리고 로봇은 0~n-1까지만 계산하면 되므로 다음칸의 로봇이 있는지 없는지, 그리고 내구도가 괜찮은지를 검사하고 로봇을 이동시키고 내구도가 0인지도 검사해준다. 그리고 또한 n-1번째에 로봇이 있다면 즉시 내려준다.
또한 0에서 로봇을 올려주는 작업도 동일하게 수행하며 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int m = 2 * n;
List<Integer> arr = new ArrayList<>();
List<Boolean> robot = new ArrayList<>();
for (int i = 0; i < m; i++) {
arr.add(Integer.parseInt(st.nextToken()));
robot.add(false);
}
int answer = 0;
int zero = 0;
while (zero < k) {
Collections.rotate(arr, 1);
Collections.rotate(robot, 1);
robot.set(n-1, false);
for (int i = n-2; i >= 0; i--) {
if (robot.get(i) && !robot.get(i+1) && arr.get(i+1) > 0) {
robot.set(i+1, true);
robot.set(i, false);
int next = arr.get(i+1) - 1;
arr.set(i+1, next);
if (next == 0) {
zero++;
}
}
}
robot.set(n-1, false);
if (!robot.get(0) && arr.get(0) > 0) {
robot.set(0, true);
int next = arr.get(0) - 1;
arr.set(0, next);
if (next == 0) {
zero++;
}
}
answer++;
}
System.out.println(answer);
}
}
처음에는 정수 배열과 불린 배열을 통해서 회전을 구현했는데 이 부분보다 리스트 rotate를 쓰는 것이 편한 것 같다.