문제출저
https://www.acmicpc.net/problem/20055
20055번: 컨베이어 벨트 위의 로봇
길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부
www.acmicpc.net
문제분석
컨베이어 벨트의 길이는 2N
컨베이어 벨트의 회전 -> 내구도와 로봇 위치 모두 회전한다.
컨베이어 벨트의 내구도 감소 -> 로봇을 올릴 때, 로봇이 움직일 때
로봇은 N에 도달하면 내린다.
위의 조건을 생각하면 코드를 구현한다.
컨베이어 벨트의 회전
-> 리스트로 구현, 뒤의 것을 빼서 앞에 것을 넣으면 회전하는 것 처럼 구현이 된다.
컨베이어 내구도 감소
-> 로봇을 올릴 때 : 컨베이어 벨트의 내구도 0보다 큰지 확인한다. 올리면 내구도가 감소한다.
-> 로봇이 이동할 때 :
로봇의 위치 표시는 크기가 [n-1] int 배열로 표시했다. (boolean 으로 해도 가능)
이동한 칸에 컨베이어 벨트의 내구도가 0보다 큰지, 로봇이 이미 있는지 확인한다. 이동한 후 내구도를 감소시킨다.
소스코드
package bakjoon;
import java.lang.*;
import java.io.*;
import java.util.*;
/*
컨베이어 벨트 회전 -> 내구도도 같이 회전
로봇은 n-1이 되면 내린다.
*/
public class b20055컨베이어벨트위의로봇 {
static int n; // 컨베이어 벨트의 길이
static int k; // 내구도가 다 닳은 칸의 갯수 : 종료 조건
static ArrayList<Integer> belt; // 컨베이어 벨트 내구도 현황
static int[] robot; // 로봇의 현재 위치 표시
static int count; // 내구도가 다 닳은 컨베이어 벨트
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());
count = 0;
belt = new ArrayList<>();
st = new StringTokenizer(br.readLine());
for(int i = 0; i < n*2; i++) {
belt.add(Integer.parseInt(st.nextToken()));
}
robot = new int[n]; // 0 ~ n-1
int answer = 0;
// 내구도가 0인개 k개 나올 때 까지 4가지 일을 반복한다.
while (count < k) {
rotate();
robot_move();
robot_insert();
answer++;
}
System.out.println(answer);
}
// 벨트가 회전
public static void rotate() {
// 벨트 회전
Integer lastBelt = belt.remove(belt.size()-1);
belt.add(0, lastBelt);
// 로봇 한 칸씩 앞으로 이동
for (int i = n-1; i >= 0; i--) {
if(robot[i] == 1) {
robot[i+1] = 1;
robot[i] = 0;
}
}
// 벨트 끝에 도착하며 내리기
if(robot[n-1] == 1) {
robot[n-1] = 0;
}
}
// 로봇 앞으로 움직이기
public static void robot_move() {
// 로봇 한 칸씩 앞으로 이동
for (int i = n - 2; i >= 0; i--) {
if(robot[i] == 1) {
if(robot[i+1] == 0 && belt.get(i+1) > 0) {
robot[i + 1] = 1;
robot[i] = 0;
belt.set(i + 1, belt.get(i + 1) - 1);
if(belt.get(i+1) == 0) {
count++;
}
// 벨트 끝에 도착하며 내리기
if(i+1 == n-1) {
robot[i+1] = 0;
}
}
}
}
}
// 시작 위치에 로봇 올리기
public static void robot_insert() {
if(belt.get(0) > 0) {
robot[0] = 1;
belt.set(0, belt.get(0) - 1);
if(belt.get(0) == 0) {
count++;
}
}
}
}