Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

[BOJ 20055] 컨베이어 벨트 위의 로봇 (Java) 본문

Problem Solving

[BOJ 20055] 컨베이어 벨트 위의 로봇 (Java)

흑개 2022. 3. 30. 14:02

https://www.acmicpc.net/problem/20055

 

20055번: 컨베이어 벨트 위의 로봇

길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부

www.acmicpc.net

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class Main_BOJ_20055 {
	static int N, K;
	static boolean[] robots;
	static int[] belts;
	static int cnt=0;
	public static void main(String[] args) throws IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer(br.readLine());
		N=Integer.parseInt(st.nextToken());
		K=Integer.parseInt(st.nextToken());
		robots=new boolean[2*N];
		belts=new int[2*N];
		st=new StringTokenizer(br.readLine());
		for (int i=0; i<2*N; i++) {
			belts[i]=Integer.parseInt(st.nextToken());
		}
		int step=0;
		while (check()) {
			rotate();
			move();
			load();
			step++;
		}
		System.out.println(step);
	}
	private static void rotate() {
		robots[N-1]=false;
		int temp1=belts[2*N-1];
		for (int i=2*N-1; i>0; i--) {
			belts[i]=belts[i-1];
		}
		belts[0]=temp1;
		boolean temp2=robots[2*N-1];
		for (int i=2*N-1; i>0; i--) {
			robots[i]=robots[i-1];
		}
		robots[0]=temp2;
		robots[N-1]=false; 
	}
	
	private static void move() {
		for (int i=2*N-1; i>=0; i--) {
			int next=(i+1)%(2*N);
			if (robots[i] && !robots[next] && belts[next]>=1) {
				robots[i]=false;
				robots[next]=true;
				belts[next]-=1;
			}
		}
	}
	
	private static void load() {
		if (!robots[0] && belts[0]>0) {
			robots[0]=true;
			belts[0]-=1;
		}
		
	}
	private static boolean check() {
		int cnt=0;
		for (int i = 0; i < belts.length; i++) {
			if (belts[i]==0) {
				cnt++;
			}
		}
		if (cnt<K) return true;
		else return false;
	}
	
	

}

시뮬레이션 문제..

괜히 어렵게 풀었다가 93퍼에서 계속 틀렸습니다 뜨길래 아예 갈아엎어(??) 버렸다..

 

belts[i]=>벨트에서 i번째 칸에 있는 것의 내구도

robots[i]=>벨트에서 i번째 칸에 로봇이 올라와 있는지

 

rotate 함수: 2*N-1 번째부터 시작해 앞의 값을 가져오는 식으로 회전을 진행한다. 로봇도 마찬가지로 움직여준다. (벨트과 같이 이동하므로) 이때 주의할 점은 회전 전, 후로 내리는 위치에 있는 로봇을 내려줘야 하는 것이다.

 

move 함수: 2*N-1 번째부터 시작해(먼저 올라온 로봇일수록 끝 칸에 존재한다) next 칸에 로봇이 없고, next 칸에 내구도가 1 이상일 경우에만 로봇을 옮겨주도록 한다.

 

load 함수: 0번째 벨트에 로봇 없고, 내구도 1 이상인 경우 올려준다.

 

 

이 문제는 간단하게..배열 2개를 이용한다. 그리고 그 배열의 인덱스를 "i번째 칸" 으로 간주해준다.