알고리즘/문제 풀이

[Java/자바 20055 백준] 컨베이어 벨트 위의 로봇

광규니 2022. 1. 5. 13:08
반응형

설명

문제 자체가 어렵진 않지만, 조건이나 설명이 헷갈린 문제였습니다.

컨베이어 벨트이고, N 이후에는 낭떠러지라고 생각하면 됩니다. 순환하는 원형이고 1~N까진 로봇이 존재할 수 있지만, N+1~2N까지는 존재 X

풀이

순서대로 진행하면

1. 과정에서 벨트와 로봇이 움직이게되는데, 이때 내리는 위치에 도달한 로봇은 즉시 내려갑니다. moveBelt()

2. 로봇이 앞에 칸에 내구도가 1이상이며, 로봇이 존재하지 않는다면 앞으로 이동하게 됩니다. 앞에 칸의 내구도는 -1. moveRobot()

3. 올리는 위치에 내구도가 1이상이면 로봇을 올려주고, 내구도를 -1 시켜줍니다. newRobot()

 

2,3번 과정에서 내구도가 -1되는 칸마다 0이 된 칸을 확인해주었습니다.

 

import java.io.*;
import java.util.*;

public class Main{
	static int N, K, left, right, answer;
	static int[] map;
	static boolean[] robot;
	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());
		// 컨베이어 벨트 길이 2*N 
		map = new int[2*N];
		// 로봇 위치 N
		robot = new boolean[N];
		
		st = new StringTokenizer(br.readLine(), " ");
		for(int i = 0 ; i < 2*N ; i++) {
			map[i] = Integer.parseInt(st.nextToken());
		}
		
		left = 0;
		right = N;
		
		while(K>0) {
			answer++;
			moveBelt();
			moveRobot();
			newRobot();
		}
		System.out.println(answer);
	}
	
	private static void moveBelt() {
		left --;
		if(left < 0) {
			left = 2*N -1;
		}
		right --;
		if(right < 0) {
			right = 2*N - 1;
		}
		// 벨트가 움직임에 따라 로봇 위치 재조정 robot은 길이가 N, 0이되는 부분은 밑에서 올라와서 false, N-1도달하면 내리는 위치여서 false;
		for(int i = N-2 ; i > 0 ; i--) {
			robot[i] = robot[i-1];
		}
		robot[0] = false;
		robot[N-1] = false;
	}
	
	private static void moveRobot() {
		// 떨어지는위치 쪽이 올리는 위치보다 먼저 더 로봇이 올라갔으므로 뒤쪽을 먼저 옮겨야한다.
		for(int i = N-2 ; i >= 0 ; i--) {
			// 로봇이 있는 위치
			if(robot[i]) {
				// map배열 기준으로 left + i + 1
				// 로봇배열 기준으로 N-2
				int next = left + i + 1;
				if(next >= 2*N) next -= 2*N;
				
				if(!robot[i+1] && map[next] >=1) {
					robot[i] = false;
					if(i+1 < N-1) robot[i+1] = true;
					
					map[next] --;
					if(map[next] == 0) K--;
				}
			}
		}
	}
	
	private static void newRobot() {
		if(map[left] > 0) {
			robot[0] = true;
			map[left] --;
			if(map[left] == 0) K--;
		}
	}
}

ref) 

https://jellyinghead.tistory.com/69 - 참고하면서 이해가 잘 가지 않은 부분은 리팩토링 진행했습니다.

반응형