[문제]
https://www.acmicpc.net/problem/20055
[풀이]
단순 시뮬레이션. 하라는 순서대로 구현하면 된다. 딱히 설명할 게 없다..
편의를 위해 컨베이어 벨트 내구도를 저장하는 배열과 로봇 위치를 저장하는 배열을 따로 뒀는데 컨베이어 벨트 회전할 때 로봇 위치도 변경하는 거 잊지 않도록 주의!
[코드]
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;
}
}
'알고리즘 공부 및 문제 풀이 > 백준(BOJ)' 카테고리의 다른 글
[boj] 백준 gold5 5557 1학년 (Java) - dp (0) | 2023.04.15 |
---|---|
[boj] 백준 21611 마법사 상어와 블리자드 (Java) - 시뮬레이션 (0) | 2023.04.09 |
[boj] 백준 21068 상어 초등학교 (Java) - 시뮬레이션 (0) | 2023.04.08 |
[boj] 백준 21609 상어 중학교 (Java) - 시뮬레이션, BFS (0) | 2023.04.08 |
[boj] 백준 23288 주사위 굴리기 2 (Java) - 시뮬레이션, BFS (0) | 2023.04.05 |