꾸물꾸물 졔의 개발공부
[백준] 20055 컨베이어 벨트 위의 로봇 - JAVA 본문
https://www.acmicpc.net/problem/20055
20055번: 컨베이어 벨트 위의 로봇
길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부
www.acmicpc.net
[풀이]
- 구현 (시뮬레이션) 문제
- 각 칸의 robot 갯수와 내구도를 1차원 정수 배열에 저장
- 아래 조건들만 잘 참고해서 그대로 구현하면 된다.!
1. 내리는 위치 [N-1] 인덱스에는 로봇이 무조건 0개이다. (언제든지 "내리는"위치에 도달하면 그 즉시 내리므로)
2. 내리는 위치 이후([N] ~ [2*N-1] 인덱스) 부터는 로봇이 무조건 0개이다. (위와 동일한 이유)
> 즉 로봇을 이동시키는 과정에서 "내리는 위치"에 도착했다면 무조건 robot을 0개로 바꿔주어야한다.
🫠 구현과정 - 주석 참고
[소스 코드]
import java.util.*;
import java.io.*;
public class Main {
static int power[]; //각 칸의 내구도
static int robot[]; //각 '컨베이너'벨트위의 로봇
static int N, K;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st= new StringTokenizer(br.readLine(), " ");
N= Integer.parseInt(st.nextToken());
K= Integer.parseInt(st.nextToken());
power= new int[N*2];
robot = new int[N];
st= new StringTokenizer(br.readLine(), " ");
for(int i=0; i<power.length; i++) {
power[i]= Integer.parseInt(st.nextToken());
}
start();
}
private static void start() {
int time =0;
while(!isEnd()) {
Rotate();
Move();
Up();
time++;
}
System.out.println(time);
}
//1.벨트가 각 칸 위에 있는 로봇과 한칸 회전한다.
private static void Rotate() {
//로봇 옮기기
for(int i=N-1; i>0; i--) {
robot[i] = robot[i-1];
}
robot[0]=0;
robot[N-1]=0; //"내리는위치" 도착하는 즉시 로봇 내리기
//벨트 옮기기
int tmp = power[N*2 -1];
for(int i= N*2-1; i>0; i--) {
power[i] = power[i-1];
}
power[0] = tmp;
}
//2.가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 ~
private static void Move() {
//N-1번칸은 내리는 위치이기 때문에 무조건 로봇이 없음
//가장 먼저 벨트에 올라간 로봇부터 탐색해야 하므로 끝에서 부터 역순으로
for(int i = N-2; i >=0; i--) {
//이동할 로봇이 있고, 이동하려는 칸에 로봇이 없고, 내구도 1이상이라면
if(robot[i]>0 && power[i+1] > 0 && robot[i+1] == 0) {
power[i+1] --;
if(i+1 == N-1) robot[i+1] = 0; //"도착지점"에 도착하는 즉시 내리기
else robot[i+1] =1;
robot[i]=0;
}
}
}
//3.올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
private static void Up() {
if(power[0] > 0) {
power[0]--;
robot[0] ++;
}
}
//4.내구도가 0인 칸의 갯수가 K개 이상이라면 과정 종료
private static boolean isEnd() {
int cnt =0;
for(int i=0; i<power.length; i++) {
if(power[i]==0) cnt++;
if(cnt == K) return true;
}
return false;
}
}//end of class
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 18428 감시 피하기 - JAVA (0) | 2023.09.22 |
---|---|
[백준] 2668 숫자고르기 - JAVA (0) | 2023.09.22 |
[백준] 16918 봄버맨 - JAVA (0) | 2023.09.11 |
[백준] 12919 A와 B 2 - JAVA (0) | 2023.09.08 |
[백준] 5052 전화번호 목록 - JAVA (0) | 2023.09.07 |