[백준(Baekjoon)][자바(java)] [삼성 SW 역량 테스트 기출 문제] 20055 : 컨베이어 벨트 위의 로봇

728x90

 

www.acmicpc.net/problem/20055

 

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

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

www.acmicpc.net

 

문제 풀이

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

public class Main {
	
	static int a[], u, d, c;  // array of durabilities, going up/down position, cnt of cell durablility is zero
	static boolean b[];  // is there a box ?
	
	public static void moveRobot( int i, int j ) {  // i : current idx, j : next idx
		if( b[i] && !b[j] && a[j] > 0 ) {
			if( j != d )
				b[j] = true;
			b[i] = false;
			if( --a[j] == 0 ) c++;
		}
	}

	public static void main(String[] args) throws Exception {
		
		BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) );
		StringTokenizer st = new StringTokenizer( br.readLine() );
		int n = Integer.parseInt( st.nextToken() ), k = Integer.parseInt( st.nextToken() ), m = 2*n, i;
		a = new int[m];
		st = new StringTokenizer( br.readLine() );
		for( i = 0; i < m; i++ )
			a[i] = Integer.parseInt( st.nextToken() );
		br.close();
		
		int s = 0;  // step
		u = 0; d = n-1; c = 0;
		b = new boolean[m];
		while( c < k ) {  /* 4. 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다. */
        	/* 단계 */
			s++;
            /* 1. 벨트 한 칸 회전 */
			if( --u < 0 ) u = m-1;
			if( --d < 0 ) d = m-1;
			if( b[d] ) b[d] = false;  /* 내려가는 위치에 로봇이 있는 경우 로봇은 반드시 땅으로 내려가야 한다 */
			/* 2. 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. */
            if( u < d ) {
				for( i = d-1; i >= u; --i )
					moveRobot( i, i+1 );
			}
			else {
				for( i = d-1; i >= 0; --i )
					moveRobot( i, i+1 );
				for( i = m-1; i >= u; --i )
					moveRobot( i, i == m-1 ? 0 : i+1 );
			}
            /* 3. 올라가는 위치에 로봇이 없다면 로봇을 하나 올린다. */
			if( !b[u] && a[u] > 0 ) {
				b[u] = true;
				if( --a[u] == 0 ) c++;
			}
		}
		
		System.out.println( s );
		
	}
}
  1. 벨트가 한 칸 회전한다.
  2. 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.
    • 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
  3. 올라가는 위치에 로봇이 없다면 로봇을 하나 올린다.
  4. 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.

 

 

반응형