20055 컨베이어 벨트 위의 로봇 : https://www.acmicpc.net/problem/20055
주어진 조건
컨베이어 벨트[0] : 올리는 위치, 컨베이어 벨트[N-1] : 내리는 위치
로봇을 옮기는 과정은 아래와 같다.
public class 컨베이어벨트위의로봇 {
static int N;
static int K;
static int[] belt;
static int[] durability;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
//벨트의 총 길이 2N
belt = new int[N*2];
//벨트의 내구도 길이 2N
durability = new int[N*2];
st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < 2*N; i++) {
durability[i] = Integer.parseInt(st.nextToken());
}
int answer = move();
bw.write(String.valueOf(answer));
bw.flush();
bw.close();
}
//로봇을 옮기는 과정
static int move() {
int turn = 1;
while (true) {
//1번 과정 : 벨트 회전
moveBelt();
//2번 과정 : 로봇 이동
moveRobot();
//3번 과정 : 로봇을 올리는 위치에 올리기
setRobot();
//4번 과정 : 내구도 0인 개수가 K개 이상인가
if (check())
break;
turn++;
}
return turn;
}
//컨베이어 벨트 마지막에 있는 값과 내구도는 회전 후 첫번째에 위치
static void moveBelt() {
int b = belt[2*N - 1];
int d = durability[2*N - 1];
for (int i = 2*N - 1; i > 0; i--) {
belt[i] = belt[i - 1];
durability[i] = durability[i - 1];
}
belt[0] = b;
durability[0] = d;
//N-1은 내리는 위치 이므로 무조건 0
belt[N - 1] = 0;
}
static void moveRobot() {
for (int i = N - 1; i > 0; i--) {
//이동할 로봇이 없다면 다음 벨트 확인
if (belt[i - 1] == 0)
continue;
//먼저 올린 로봇 순으로 다음 이동할 곳의 내구도가 0이 아니고 로봇이 없는 경우만 이동
if (belt[i] == 0 && durability[i] > 0) {
belt[i] = belt[i - 1];
belt[i - 1] = 0;
durability[i]--;
}
}
//N-1은 내리는 위치 이므로 무조건 0
belt[N-1] = 0;
// belt[0] = 0;
}
//올리는 위치에 로봇 올리기
static void setRobot() {
if (belt[0] == 0 && durability[0] > 0) {
belt[0] = 1;
durability[0]--;
}
}
//내구도 0인 개수가 K개 이상인가
static boolean check() {
int count = 0;
for (int d : durability) {
if (d == 0) {
count++;
}
}
return count >= K;
}
}
문제를 제대로 읽지않고 맞왜틀 해버렸다.
내리는 위치는 N이다. (2*N)-1 이 아니라..