본문 바로가기

알고리즘/시뮬

백준_20055_컨베이어 벨트 위의 로봇

 

문제 링크

조건

  • N : 벨트 한 쪽 면 길이 (2 <= N <= 100)
  • K : 내구도 0인 개수 limit
  • A[] : 내구도 배열 (1 <= Ai <= 1000)

 

접근 방법

  • strong[] : 1 ~ 2*N 위치까지 벨트의 내구도 점수 저장
  • robot[] : 1 ~ 2*N 위치까지 벨트 위에 로봇 존재 여부 저장
  • 동작 과정
    1. 벨트는 +1 방향으로 한 칸 회전 ( sp -startpoint- 와 ep -endpoint- 를 각각 -1씩 해줌)
      • 바뀐 ep에 robot이 있는 경우 내려줄 것!
    2. ep -> sp 순으로(가장 먼저 벨트에 올라간 로봇부터) 로봇 위치 +1
      • 이동할 위치에 로봇이 없고, 내구도가 1 이상이어야 함 
      • 로봇이 이동한 위치가 ep일 경우 내려줄 것!
      • 이동한 위치의 벨트 내구도가 0이 됐으면 K--
    3. sp위치에 새로운 로봇 올려줌
      • sp위치에 로봇이 없고, 내구도가 1 이상이어야 함
      • 올린 위치의 벨트 내구도가 0이 됐으면 K--
    4. K > 0 이라면 위 과정 반복

 

솔루션


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	static int N, K;
	static int[] strong;
	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().trim(), " ");
	
		N = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());
	
		int len = N * 2;
		strong = new int[len + 1];
		
		st = new StringTokenizer(br.readLine().trim(), " ");
		for(int i = 1; i < len+1; i++) {//내구도 입력 
			strong[i] = Integer.parseInt(st.nextToken());
		}
		
		robot = new boolean[len + 1];
		int sp = 1;
		int ep = N;
		
		int level = 0;
		while(K > 0) {
			level++;
			
			//1. 벨트 이동
			if(--sp == 0) sp = len;
			if(--ep == 0) ep = len;
			
			if(robot[ep]) {//내려가는 위치 도착하면 로봇 내려줌
				robot[ep] = false;
			}
			
			
			//2. ep -> sp 순으로 로봇 위치 +1
			int cur = ep;
			while(cur != sp) {
				if(robot[cur]) {
					int next = cur == len ? 1 : cur+1;
				
					if(!robot[next] && strong[next] > 0) {//이동 위치에 로봇 없고 내구도 0 이상
						robot[cur] = false;
						if(next != ep) robot[next] = true;///////// 내려가는 위치에 도착하면 로봇 바로 내려줌!! //////////
						if(--strong[next] == 0) K--;
					}
				}
				
				if(--cur == 0) cur = len;
			}
			
			//3. sp에 로봇 없으면 올림
			if(!robot[sp] && strong[sp] > 0) {
				robot[sp] = true;
				if(--strong[sp] == 0) K--;
			}
		}
		
		System.out.println(level);
	}

}

 

리뷰

  • 로봇이 한 칸씩 이동 후 ep에 도착한 로봇은 바로 내려주는 작업을 까먹어 한참 헤맴
  • 시뮬은 꼼꼼하게 주어진 조건 확인해서 적용하는 게 중요함..

'알고리즘 > 시뮬' 카테고리의 다른 글

백준_15685_드래곤 커브  (0) 2021.03.18
백준_미세먼지안녕!_17144  (0) 2021.01.25
백준_PuyoPuyo_11559  (0) 2021.01.20
백준_빗물_14719  (0) 2021.01.13