알고리즘 공부 및 문제 풀이/백준(BOJ)
[boj] 백준 20055 컨베이어 벨트 위의 로봇 (Java) - 시뮬레이션
yoonjiy
2023. 4. 8. 01:27
[문제]
https://www.acmicpc.net/problem/20055
20055번: 컨베이어 벨트 위의 로봇
길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부
www.acmicpc.net
[풀이]
단순 시뮬레이션. 하라는 순서대로 구현하면 된다. 딱히 설명할 게 없다..
편의를 위해 컨베이어 벨트 내구도를 저장하는 배열과 로봇 위치를 저장하는 배열을 따로 뒀는데 컨베이어 벨트 회전할 때 로봇 위치도 변경하는 거 잊지 않도록 주의!
[코드]
package 시뮬레이션;
import java.io.*;
import java.util.*;
public class boj_20055_java {
static int n, k;
static int[] belt;
static boolean[] robot;
static int cnt;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
belt = new int[2*n+1]; //컨베이어 벨트 내구도 저장
st = new StringTokenizer(br.readLine());
for(int i=1; i<=2*n; i++){
belt[i] = Integer.parseInt(st.nextToken());
}
//내구도가 0인 칸의 개수가 k 이상이라면 종료
cnt = 0;
int level = 0;
robot = new boolean[2*n+1]; //로봇 위치
while(cnt < k){
level++;
//컨테이너벨트 한 칸 회전
rotateBelt();
//가장 먼저 올라간 로봇부터 이동할 수 있다면 한 칸 이동 -> 내구도 1 감소
moveRobot();
//1번 위치에서 로봇이 올라갈 수 있다면 올라감 -> 내구도 1 감소
if(belt[1]>=1 && !robot[1]){
robot[1] = true;
belt[1]--;
if(belt[1]==0) cnt++;
}
}
System.out.println(level);
}
public static void moveRobot(){
//내구도가 1이상, 다른 로봇이 없음
for(int i=n-1; i>=1; i--){
if(!robot[i]) continue;
if(belt[i+1]>=1 && !robot[i+1]){
robot[i+1] = true;
robot[i] = false; //로봇 이동
belt[i+1]--; //내구도 감소
if(belt[i+1]==0) cnt++;
}
}
//n에 위치한 로봇 내리기
if(robot[n]) robot[n] = false;
}
public static void rotateBelt(){
int temp = belt[2*n];
for(int i=2*n-1; i>=1; i--){
belt[i+1] = belt[i];
}
belt[1] = temp;
//로봇 위치 배열도 회전
boolean tempR = robot[n];
for(int i=n-1; i>=1; i--){
robot[i+1] = robot[i];
}
robot[1] = tempR;
//n에 위치한 로봇 내리기
if(robot[n]) robot[n] = false;
}
}