20055 Samsung sw test
알고리즘 (구현)
1
2
3
1. durability와 isThereRobot 변수로 구성된 Cell 구조체로 컨베이어 벨트를 만듦
2. 무한 루프 안에서, 이동시키고 -> 내리는 위치 로봇빼고 -> 로봇이동 시키고(이동시 내구도 1감소) -> 내리는 위치 로봇빼고 -> 올리는 위치 로봇 올리고(내구도 1감소)
-> 내구도 0인 칸이 한계점에 닿으면 종료
기타
1
1. 매번 내구도 0인 칸이 몇개인지 세기보단, 내구도를 깎는 칸에 깎고나서 내구도 0이면 count++를 하여, count가 한계점에 닿는지 확인하는 편이 훨씬 빠르게 할 수 있다.
코드
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
#include <iostream>
#define MAX_WIDTH 100
using namespace std;
typedef struct Cell {
int durability;
bool robot;
} Cell;
Cell belt[2][MAX_WIDTH];
int width, maxDurability;
int getLastSecond();
bool checkDurability();
int main() {
cin >> width >> maxDurability;
for (int i = 0; i < width; i++) {
cin >> belt[0][i].durability;
belt[0][i].robot = false;
}
for (int i = width - 1; i >= 0; i--) {
cin >> belt[1][i].durability;
belt[1][i].robot = false;
}
cout << getLastSecond();
}
int getLastSecond() {
int second = 0;
int zero = 0;
while (true) {
second++;
//벨트 한칸 씩 이동
Cell temp = belt[0][0];
for (int i = 1; i < width; i++) {
Cell temp2 = belt[0][i];
belt[0][i] = temp;
temp = temp2;
}
for (int i = width - 1; i >= 0; i--) {
Cell temp2 = belt[1][i];
belt[1][i] = temp;
temp = temp2;
}
belt[0][0] = temp;
belt[0][width - 1].robot = false;
//로봇 이동
for (int i = width - 2; i >= 0; i--) {
if (belt[0][i].robot) {
if (!belt[0][i + 1].robot && belt[0][i + 1].durability > 0) {
belt[0][i + 1].robot = true;
belt[0][i + 1].durability--;
if (belt[0][i + 1].durability == 0)
zero++;
belt[0][i].robot = false;
}
}
}
belt[0][width - 1].robot = false;
//로봇 올리기
if (!belt[0][0].robot && belt[0][0].durability > 0) {
belt[0][0].durability--;
if (belt[0][0].durability == 0)
zero++;
belt[0][0].robot = true;
}
//체크
if (zero >= maxDurability)
break;
}
return second;
}