꾸물꾸물 졔의 개발공부

[백준] 20055 컨베이어 벨트 위의 로봇 - JAVA 본문

알고리즘/백준

[백준] 20055 컨베이어 벨트 위의 로봇 - JAVA

체제 2023. 9. 11. 16:14

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