❓ 문제 - 백준 컨베이어 벨트 위의 로봇 20055번 - JAVA 풀이법
출처
(https://www.acmicpc.net/problem/20055)
📝 문제해결법
1. 이 문제는 구현으로 풀었다.
- ArrayList를 활용해서 벨트의 각 칸에 남은 내구도를 관리하며, robot의 배열로 0~n-1칸에 있는 로봇이 있는지 없는지를 체크해준다.
- while을 통해 내구도가 0인 칸의 개수가 k개 이상인지 매번 체크하면서 조건에 순서에 맞춰 컨베이어벨트를 돌린다.
- 처음에 컨베이어벨트가 한 칸 이동 처리해주고, 해당 컨베이어벨트가 한 칸씩 움직이면 로봇도 동시에 움직이므로 한칸씩 이동 처리 해준다. 그리고 n-1에 위치에서는 항상 로봇이 내리므로 로봇이 내림처리 해준다.
- 그 다음 로봇의 이동이 이뤄지는데 n-1 ~ 1까지 현재 칸에서 로봇이 없는 상태에서 옆에 로봇이 존재한다면 현재 칸의 내구도가 1이상인지 체크한 후 나의 칸으로 로봇을 이동시켜준다.
- 그리고 로봇을 이동처리 했을 순간에 내구도가 0으로 된 각 칸의 수를 cnt로 카운트 해준다.
- 그 뒤에 올리는 위치(0)에 내구도가 1이상인지 체크해서 1이상이라면 로봇을 올릴 수 있다. 그리고 아까와 같이 로봇을 올린 순간에 내구도가 0이되면 cnt을 1증가시켜준다.
- 로봇을 옮기는 과정까지 다 처리한 후 내구도 0인게 k개 이상이라면 break를 통해 컨베이어벨트의 이동을 중지한다.
💻 소스코드
// BOJ - 컨베이어 벨트 위의 로봇 (20055번)
// 구현
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main_20055 {
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());
ArrayList<Integer> power = new ArrayList<>();
boolean[] robot = new boolean[n];
st = new StringTokenizer(br.readLine(), " ");
for(int i=0;i<2*n;i++) {
power.add(Integer.parseInt(st.nextToken()));
}
int time = 1;
int cnt = 0;
while(true) {
// 컨베이어 벨트 한칸 이동
int last = power.get(2*n-1);
power.remove(2*n-1);
power.add(0, last);
// 로봇 같이 한칸 이동
for(int i=n-1;i>=1;i--) {
robot[i] = robot[i-1];
}
robot[n-1] = false;
robot[0] = false;
// 로봇의 이동
for(int i=n-1;i>=1;i--) {
int p = power.get(i);
if(p > 0 && !robot[i] && robot[i-1]) {
robot[i] = true;
power.set(i, p-1);
robot[i-1] = false;
if(p-1 == 0) {
cnt++;
}
}
}
int first_p = power.get(0);
if(first_p > 0) {
power.set(0, first_p-1);
robot[0] = true;
if(first_p == 1) {
cnt++;
}
}
if(cnt >= k) {
break;
}
time++;
}
System.out.println(time);
}
public static void print(boolean[] arr) {
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]?'t':'f');
System.out.print(" ");
}
System.out.println();
}
}
'알고리즘 > 알고리즘문풀' 카테고리의 다른 글
BOJ - 마법사 상어와 토네이도 20057번 (JAVA) (0) | 2022.04.30 |
---|---|
BOJ - 마법사 상어와 파이어볼 20056번 (JAVA) (0) | 2022.04.30 |
BOJ - 스타트택시 19238번 (JAVA) (0) | 2022.04.30 |
BOJ - 어른 상어 19237번 (JAVA) (0) | 2022.04.30 |
BOJ - 청소년 상어 19236번 (JAVA) (0) | 2022.04.30 |