알고리즘/백준

[백준 20055] 컨베이어 벨트 위의 로봇 C++

겜도리도리 2022. 7. 12. 23:49
반응형

문제

백준 20055 컨베이어 벨트 위의 로봇 C++

 

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

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

www.acmicpc.net

풀이

구현 / 시뮬레이션 문제입니다.

생각보다 코드 구현과정이 어려웠는데, 문제 난이도인 골드 5보다는 어려웠습니다. (골드 4~3급은 된다고 생각)

문제에서 주어진 조건에 따라

1. 벨트가 한 칸 회전한다.

2. 벨트 위의 로봇이 움직일 수 있으면 움직인다.

3. 올리는 칸의 내구도가 0이 아니면 로봇을 올린다.

4. 내구도가 0인 칸이 K개 이상이면 종료한다.

의 4가지 과정을 순서대로 구현해주면 됩니다.

로봇이 있는지 체크하는 bRobot, 내구도 정보를 가지고 있는 durability 2가지 배열을 사용했는데,

클래스로 만들었으면 더욱 깔끔하게 정리가 가능했을 것 같습니다.

소스 코드

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
 
int N, K;
 
int Rotate(int value)
{
    int result = (value - 1) % (2 * N);
    if (result < 0)
        result += (2 * N);
 
    return result;
}
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
 
    int result = 0;
    int durability[200= { 0 };
    bool bRobot[200= { false };
    vector<int> vecRobotPos;
 
    cin >> N >> K;
 
    for (int i = 0; i < 2 * N; i++)
    {
        cin >> durability[i];
    }
 
    int upPos = 0;
    int downPos = N - 1;
    int zeroCnt = 0;
    int totalSize = 2 * N;
 
    while (1)
    {
        result++;
 
        // 1. 벨트가 한 칸 회전한다.
        upPos = Rotate(upPos);
        downPos = Rotate(downPos);
 
        // 회전했을 때 로봇 제거
        for (int i = 0; i < vecRobotPos.size(); i++)
        {
            if (vecRobotPos[i] == downPos)
            {
                bRobot[vecRobotPos[i]] = false;
                vecRobotPos.erase(vecRobotPos.begin() + i);
                i--;
            }
        }
 
        // 2. 벨트 위의 로봇이 한 칸 이동한다.
        for (int i = 0; i < vecRobotPos.size(); i++)
        {
            int cur = vecRobotPos[i];
            int next = (cur + 1) % totalSize;
            if (bRobot[next] == false && durability[next] >= 1)
            {
                bRobot[cur] = false;
                bRobot[next] = true;
                durability[next] -= 1;
                vecRobotPos[i] += 1;
                vecRobotPos[i] %= totalSize;
 
                if (durability[next] == 0)
                    zeroCnt += 1;
            }
 
            // 이동했을 때 로봇 제거
            if (vecRobotPos[i] == downPos)
            {
                bRobot[vecRobotPos[i]] = false;
                vecRobotPos.erase(vecRobotPos.begin() + i);
                i--;
            }
        }
 
        // 3. 올리는 칸의 내구도가 0이 아니면 로봇을 올린다.
        if (durability[upPos] >= 1)
        {
            vecRobotPos.push_back(upPos);
            durability[upPos] -= 1;
            bRobot[upPos] = true;
 
            if (durability[upPos] == 0)
                zeroCnt += 1;
        }
 
        // 4. 내구도가 0인 칸의 개수가 K개 이상이라면 종료
        if (zeroCnt >= K)
            break;
    }
 
    cout << result;
    return 0;
}
cs
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 13459] 구슬 탈출 C++  (0) 2022.08.10
[백준 2665] 미로만들기 C++  (0) 2022.07.24
[백준 14890] 경사로 C++  (0) 2022.07.04
[백준 2343] 기타 레슨 C++  (0) 2022.06.26
[백준 2805] 나무 자르기 C++  (0) 2022.06.22