💡 구현/시뮬레이션
Memory 2024KB Time 60ms Code Length 2929B
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
//1. 벨트가 로봇과 함께 한칸 회전
//2. 가장 먼저 벨트에 올라간 로봇부터 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동.이동 못하면 가만히.내리는 위치면 내림.
//1) 로봇이동하려면 이동하려는 칸에 로봇이 없고 내구도가 1 이상 남아있어야한다.
//3. 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
//4. 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료.
#include<iostream>
#include<vector>
using namespace std;
int N, K;
int A[200] = { 0 };
int Robot[200] = { 0 };
void init() {
cin >> N >> K;
for (int i = 0; i < 2 * N; i++) {
cin >> A[i];
}
}
void Rotate() {
// 맵 이동
int tmp = A[2 * N - 1];
for (int i = 2 * N - 1; i > 0; i--) {
A[i] = A[i - 1];
}
A[0] = tmp;
// 로봇 이동
tmp = Robot[2 * N - 1];
for (int i = 2 * N - 1; i > 0; i--) {
Robot[i] = Robot[i - 1];
}
Robot[0] = tmp;
// 언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다
if (Robot[N - 1] == 1) {
Robot[N - 1] = 0;
}
}
void Robotmove() {
// 맨뒤의 로봇부터 움직임
for (int i = 2 * N - 2; i >= 0; i--) { // 맨 마지막에 있던 칸에 로봇은 없음
if (Robot[i] == 1 && Robot[i+1] == 0 && A[i + 1] >= 1) { // 해당칸에 로봇이 있고, 다음칸에 로봇이 없고, 다음칸의 내구도가 1이상일때
Robot[i + 1] = Robot[i]; // 이동
Robot[i] = 0;
// 올리거나 로봇이 이동하는 칸의 내구도는 1 감소.
A[i + 1] --;
}
}
// 언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다
if (Robot[N - 1] == 1) {
Robot[N - 1] = 0;
}
}
bool checkBlock() {
int cnt = 0;
for (int i = 0; i < 2 * N; i++) {
if (A[i] == 0) cnt++;
}
if (cnt >= K) return true;
else return false;
}
void printmap() {
cout << endl;
for (int i = 0; i < 2 * N; i++) {
cout << A[i] << " ";
}
cout << endl;
for (int i = 0; i < 2 * N; i++) {
cout << Robot[i] << " ";
}
cout << endl;
}
int main() {
init();
int time = 0;
while (1) {
time++;
// 올리거나 로봇이 이동하는 칸의 내구도는 1 감소.
//1. 벨트가 로봇과 함께 한칸 회전
Rotate();
//printmap();
//2. 가장 먼저 벨트에 올라간 로봇부터 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동.이동 못하면 가만히.내리는 위치면 내림.
//1) 로봇이동하려면 이동하려는 칸에 로봇이 없고 내구도가 1 이상 남아있어야한다.
Robotmove();
//printmap();
//3. 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
if (A[0] > 0) {
Robot[0] = 1; // 로봇 올리고
A[0]--;
}
//printmap();
//4. 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료.
if (checkBlock()) {
break;
}
}
cout << time << endl;
}
- 먼저 입력값을 받는다. N은 벨트의 길이, K는 내구도가 0인 칸의 개수가 K개 이상이면 작업을 종료한다.
- Rotate 함수를 통해 벨트와 로봇을 한 칸씩 회전시킨다.
- Robotmove 함수를 통해 로봇을 이동시킨다. 이때, 해당 칸에 로봇이 있고, 다음 칸에 로봇이 없고, 다음 칸의 내구도가 1 이상이어야 한다.
- 만약 올리는 위치의 내구도가 0보다 크다면 로봇을 올린다.
- 내구도가 0인 칸의 개수가 K개 이상이면 작업을 종료한다.
- 위의 과정을 반복하며 작업 시간을 측정하고, 작업이 종료되면 걸린 시간을 출력한다.