[백준] 20055. 컨베이어 벨트 위의 로봇
문제 링크
풀이 과정
문제의 조건에 맞게 구현하는 시뮬레이션 문제입니다.
while (cnt < K) {
step++;
rotate();
move();
up();
}
스텝을 증가시키며, rotate, move, up 메소드를 차례로 수행합니다.
static void rotate() {
int tmp_A = A[SIZE - 1];
boolean tmp_B = B[SIZE - 1];
for (int i = SIZE - 1; i >= 1; i--) {
A[i] = A[i - 1];
B[i] = B[i - 1];
}
A[0] = tmp_A;
B[0] = tmp_B;
if (B[N - 1]) B[N - 1] = false;
}
rotate 메소드
는 컨베이어 벨트를 시계방향으로 한바퀴 회전시킵니다. 배열 A(내구도)와 B(로봇의 유무)를 각각 한칸씩 시계방향으로 회전시킵니다. 회전이 끝나고 나면, N-1 인덱스에 있는 로봇을 땅으로 내려보냅니다.
static void move() {
for (int i = N - 2; i >= 1; i--) {
if (!B[i]) continue;
int next = (i + 1) % SIZE;
if (!B[next] && A[next] >= 1) {
if (--A[next] == 0) cnt++;
B[i] = false;
B[next] = next != N - 1 ? true : false;
}
}
}
move 메소드
는 가장 먼저 컨베이어 벨트에 올라간 로봇부터 벨트 회전 방향으로 한 칸 이동시킵니다. 가장 먼저 컨베이어 벨트에 올라간 로봇은 해당 회차에 내려가는 위치에서 가까운 순서를 의미하게 됩니다. 따라서, N-2 인덱스를 기준으로 시계 반대 방향, 즉 인덱스를 하나씩 감소시켜가며 로봇이 있는지 판단합니다. 해당 칸에 로봇이 존재하며, 이동하려는 칸에 로봇이 없으며, 내구도가 1이상 남아있다면 로봇을 전진시킵니다.
static void up() {
if (!B[0] && A[0] >= 1) {
if (--A[0] == 0) cnt++;
B[0] = true;
}
}
up 메소드
는 올라가는 위치인 인덱스 0 칸에 로봇이 없고, 내구도가 1 이상이면 새로운 로봇을 올립니다.
코드
import java.util.Scanner;
public class Main {
static int N, K, SIZE;
static int[] A;
static boolean[] B;
static int step, cnt;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
K = sc.nextInt();
SIZE = 2 * N;
A = new int[SIZE];
B = new boolean[SIZE];
for (int i = 0; i < SIZE; i++) A[i] = sc.nextInt();
while (cnt < K) {
step++;
rotate();
move();
up();
}
System.out.println(step);
}
static void rotate() {
int tmp_A = A[SIZE - 1];
boolean tmp_B = B[SIZE - 1];
for (int i = SIZE - 1; i >= 1; i--) {
A[i] = A[i - 1];
B[i] = B[i - 1];
}
A[0] = tmp_A;
B[0] = tmp_B;
if (B[N - 1]) B[N - 1] = false;
}
static void move() {
for (int i = N - 2; i >= 1; i--) {
if (!B[i]) continue;
int next = (i + 1) % SIZE;
if (!B[next] && A[next] >= 1) {
if (--A[next] == 0) cnt++;
B[i] = false;
B[next] = next != N - 1 ? true : false;
}
}
}
static void up() {
if (!B[0] && A[0] >= 1) {
if (--A[0] == 0) cnt++;
B[0] = true;
}
}
}
댓글남기기