알고리즘 문제 풀이/SWEA

[backjoon]20055 컨테이너 벨트 위의 로봇 java

v 2022. 4. 29. 23:00

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

 

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

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

www.acmicpc.net

 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import java.io.*;
import java.util.*;
 
public class Main {
    static int N;
    static int[] belt;
    static boolean[] robot;
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        belt = new int[N * 2];
        robot = new boolean[N * 2];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < 2 * N; i++) {
            belt[i] = Integer.parseInt(st.nextToken());
        }
        for (int i = 0; i < N; i++) {
            belt[i] = belt[i];
        }
        int answer = 0;
        while (true) {
            answer++;
            // 컨테이너의 이동과 함께 로봇도 함께 움직인다.
            oneStepMove();
            // 로봇이 한 칸 앞으로 간다.
            moveRobot();
            // 올리는 위치 0번 인덱스에 올릴 수 있는지 확인.
            newRobot();
            // 종료할 수 있는지 확인
            if (zeroCnt() >= K)
                break;
        }
        System.out.println(answer);
    }
 
    private static int zeroCnt() {
        int cnt = 0;
        for (int cur : belt) {
            if (cur == 0)
                cnt++;
        }
        return cnt;
    }
 
    private static void newRobot() {
        if (belt[0> 0) {
            robot[0= true;
            belt[0]--;
        }
    }
 
    private static void moveRobot() {
        for (int i = N - 1; i > 0; i--) {
            if (belt[i] > 0 && !robot[i] && robot[i - 1]) {
                robot[i] = true;
                robot[i - 1= false;
                belt[i]--;
            }
        }
    }
 
    private static void oneStepMove() {
        int temp = belt[2 * N - 1];
        for (int i = 2 * N - 1; i > 0; i--) {
            belt[i] = belt[i - 1];
            if (robot[i - 1]) {
                robot[i] = true;
                robot[i - 1= false;
            }
        }
        robot[N - 1= false;
        belt[0= temp;
    }
}
cs

 

반응형