[BOJ-Code] 20055 - 컨베이어 벨트 위의 로봇

Posted by DHniyeo Blog on April 6, 2024

문제 링크

💡 구현/시뮬레이션

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개 이상이면 작업을 종료한다.
  • 위의 과정을 반복하며 작업 시간을 측정하고, 작업이 종료되면 걸린 시간을 출력한다.