반응형

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

 

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

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

www.acmicpc.net

 

 

[ 문제풀이 ]

 

1. 컨베이어 벨트를 로봇과 함께 한 칸씩 옮깁니다.

 

2. 로봇이 움직일 수 있는 상황이라면 벨트가 움직이는 방향으로 한 칸씩 더 움직여줍니다.

 

3. 맨 처음 칸의 내구도가 0이 아니라면 로봇을 하나 올립니다.

 

4. 내구도가 0인 칸의 개수가 K개 이상이라면 멈추고, 아니라면 1로 돌아갑니다.

 

[ 소스코드 ]

 

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
#include<iostream>
 
using namespace std;
 
int N, K;
int arr[201];
int robot[101];
 
int main()
{
    scanf("%d %d"&N, &K);
 
    for (int i = 1; i <= 2*N; i++) {
        scanf("%d"&arr[i]);
    }
    
    int ans = 0;
 
    while (1) {
        ans++;
        int temp = arr[2 * N];
 
        for (int i = 2 * N; i > 0; i--) {    //벨트 옮기기
            arr[i] = arr[i - 1];
        }
        for (int i = N; i > 0; i--) {    //벨트와 같이 로봇 옮기기
            robot[i] = robot[i - 1];
        }
        robot[1= 0;
        arr[1= temp;
 
        robot[N] = 0;
        for (int i = N - 1; i > 0; i--) {    //로봇 스스로 움직이기
            if (robot[i] == 1) {
                if (arr[i + 1> 0 && robot[i + 1!= 1) {
                    robot[i + 1= 1;
                    robot[i] = 0;
                    arr[i + 1]--;
                }
            }
        }
 
        if (arr[1!= 0) {    //올리는 위치에 로봇 올리기
            arr[1]--;
            robot[1= 1;
        }
 
        int cnt = 0;
        for (int i = 1; i <= 2 * N; i++) {    //내구도 0인 칸 개수
            if (arr[i] == 0) cnt++;
        }
 
        if (cnt >= K) {
            printf("%d", ans);
            return 0;
        }
    }
}
cs
반응형

+ Recent posts