728x90
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 이상 남아 있어야 한다.
- 올라가는 위치에 로봇이 없다면 로봇을 하나 올린다.
- 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.
반응형
'코딩 문제 풀기 ( Algorithm problem solving ) > 백준 온라인 저지 ( BOJ )' 카테고리의 다른 글
[백준(Baekjoon)][자바(java)] [삼성 SW 역량 테스트 기출 문제] 14500 : 테트로미노 (0) | 2021.04.18 |
---|---|
[백준(Baekjoon)][자바(java)] [삼성 SW 역량 테스트 기출 문제] 3190 : 뱀 (0) | 2021.04.18 |
[백준(Baekjoon)][자바(java)] [삼성 SW 역량 테스트 기출 문제] 14888 : 연산자 끼워넣기 (0) | 2021.04.13 |
[백준(Baekjoon)][자바(java)] [삼성 SW 역량 테스트 기출 문제] 14889 : 스타트와 링크 (0) | 2021.04.13 |
[백준(Baekjoon)][자바(java)] [삼성 SW 역량 테스트 기출 문제] 14501 : 퇴사 (0) | 2021.04.13 |