https://www.acmicpc.net/problem/20055
20055번: 컨베이어 벨트 위의 로봇
길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부
www.acmicpc.net
풀이
- 로봇은 올리는 위치에만 올릴 수 있다.
- 언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다.
- 로봇을 올리는 위치에 올리거나 로봇이 어떤 칸으로 이동하면 그 칸의 내구도는 즉시 1만큼 감소한다.
- 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
- 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.
- 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
- 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
- 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.
전체 코드
import java.io.*;
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());
int[] a = new int[2*n];
boolean[] robot = new boolean[n];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < 2 * n; i++) {
a[i] = Integer.parseInt(st.nextToken());
}
int zero_count = 0;
int step = 0;
while (zero_count < k) {
step++;
// 1단계: 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
int temp = a[2*n-1];
for (int i = 2*n-1; i > 0; i--) {
a[i] = a[i-1];
}
a[0] = temp;
for (int i = n-1; i > 0; i--) {
robot[i] = robot[i-1];
}
robot[0] = false;
// 로봇이 내리는 위치에 도달하면 그 즉시 내린다.
robot[n-1] = false;
// 2단계: 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.
for (int i = n-2; i >= 0; i--) {
if (robot[i] && a[i+1] > 0 && !robot[i+1]) {
robot[i] = false;
robot[i+1] = true;
a[i+1]--;
if (a[i+1] == 0) {
zero_count++;
}
}
}
// 로봇이 내리는 위치에 도달하면 그 즉시 내린다.
robot[n-1] = false;
// 3단계: 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
if (a[0] > 0) {
robot[0] = true;
a[0]--;
if (a[0] == 0) {
zero_count++;
}
}
}
System.out.println(step);
}
}
어떤 칸의 내구도가 감소하는 경우에만 내구도가 0인지 체크한다. 내구도가 0이 되었으면 zero_count++을 하여, 내구도가 0인 칸의 개수를 업데이트한다.
728x90
'Algorithm 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 16234번 : 인구 이동 - 자바[Java] (0) | 2023.06.23 |
---|---|
[백준] 1325번 : 효율적인 해킹 - 자바[Java] (0) | 2023.06.23 |
[백준] 14890번 : 경사로 - 자바[Java] (0) | 2023.03.25 |
[백준] 21608번 : 상어 초등학교 - 자바[Java] (0) | 2023.03.17 |
[백준] 14719번 : 빗물 - 자바[Java] (0) | 2023.03.16 |