문제 바로가기 > 20055번: 컨베이어 벨트 위의 로봇
단계마다 이동을 할 때 각 단계마다 다음 두 조건을 반드시 지켜야 한다.
1. 로봇은 1번칸인 올리는 위치에서만 올릴 수 있다.
2. 로봇은 N번칸인 내리는 위치에 도달하면 언제든지 내려야 한다.
각 단계마다 함수로 구현해준다.
Step 1 . 벨트와 로봇 회전
- 각 칸을 이동시켜준다
- 로봇을 이동시켜준다
- 이때, 위에 언급한 조건때문에 robot[N-1] (N칸) 위치와 robot[0] (1번째 칸) 위치를 false로 시켜줘야 한다.
- robot[N-1]=false: 내리는 위치에 도달하면 언제든 내려야 한다.
- robot[0]=false: 로봇은 올리는 위치에서 3번째 Step에서만 올릴 수 있지, 로봇이 2N칸에서 1칸으로 이동하면 안된다.
public static void rotate() {
//벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
//언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다.
//이때 robot[2N-1]위치에 있는 로봇은 robot[0]에 추가하면 안된다.
int temp = map[2 * N - 1];
for (int i = 2 * N - 1; i > 0; i--) {
map[i] = map[i - 1];
}
map[0] = temp;
for (int i = N - 1; i > 0; i--) {
robot[i] = robot[i - 1];
}
robot[0] = false;
robot[N - 1] = false;
}
Step 2. 로봇 이동
- 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다.
- 만약 이동할 수 없다면 가만히 있는다.
- 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
- 이동하면 내구도는 1 감소한다.
public static void move() {
//가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다.
// 만약 이동할 수 없다면 가만히 있는다.
//로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
for (int i = N - 2; i >= 0; i--) {
if (robot[i]) {
if (!robot[i + 1] && map[i + 1] >= 1) {
robot[i + 1] = true;
map[i + 1]--;
robot[i] = false;
}
}
robot[N - 1] = false;
}
}
Step 3. 로봇 올리기
- 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
- 이때도 내구도는 1 감소한다.
public static void addRobot() {
//올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
if (map[0] > 0) {
map[0]--;
robot[0] = true;
}
}
Step 4. 내구도 검사
- 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.
public static boolean check() {
int zero = 0;
for (int i = 0; i < 2 * N; i++) {
if (map[i] == 0)
zero++;
}
return zero >= K;
}
전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class _20055 {
public static int[] map;
public static boolean[] robot;
public static int N, K;
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());
map = new int[N * 2];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < 2 * N; i++) {
map[i] = Integer.parseInt(st.nextToken());
}
robot = new boolean[N];
simulation();
}
public static void simulation() {
int i = 0;
while (!check()) {
rotate();
move();
addRobot();
i++;
}
System.out.println(i);
}
public static void rotate() {
//벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
//언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다.
//이때 robot[2N-1]위치에 있는 로봇은 robot[0]에 추가하면 안된다.
int temp = map[2 * N - 1];
for (int i = 2 * N - 1; i > 0; i--) {
map[i] = map[i - 1];
}
map[0] = temp;
for (int i = N - 1; i > 0; i--) {
robot[i] = robot[i - 1];
}
robot[0] = false;
robot[N - 1] = false;
}
public static void move() {
//가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다.
// 만약 이동할 수 없다면 가만히 있는다.
//로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
for (int i = N - 2; i >= 0; i--) {
if (robot[i]) {
if (!robot[i + 1] && map[i + 1] >= 1) {
robot[i + 1] = true;
map[i + 1]--;
robot[i] = false;
}
}
robot[N - 1] = false;
}
}
public static void addRobot() {
//올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
if (map[0] > 0) {
map[0]--;
robot[0] = true;
}
}
public static boolean check() {
int zero = 0;
for (int i = 0; i < 2 * N; i++) {
if (map[i] == 0)
zero++;
}
return zero >= K;
}
}
'ProblemSolve > BOJ' 카테고리의 다른 글
[백준] 4384번: 공평하게 팀 나누기 -JAVA (0) | 2024.07.31 |
---|---|
[백준] 11000번: 강의실 배정 - JAVA (0) | 2024.07.29 |
[백준] 2062번: 돌다리 건너기 - JAVA (0) | 2024.07.22 |
[백준] 1629번: 곱셈 -JAVA (0) | 2024.07.19 |
[백준] 1202번: 보석도둑 -JAVA (2) | 2024.07.18 |