https://www.acmicpc.net/problem/20055
20055번: 컨베이어 벨트 위의 로봇
길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부
www.acmicpc.net
회전하는 문제 -> deque를 쓰자
https://www.acmicpc.net/problem/1021
1021번: 회전하는 큐
첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가
www.acmicpc.net
con.push_front(con.back());
con.pop_back();
deque의 index는 0부터 시작한다.
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
|
#include <iostream>
#include <deque>
using namespace std;
deque<int> naegu;
deque<bool> con; //로봇이 위에 있으면 true, 없으면 false
int n, k;
//컨베이어 벨트의 회전
void rotate()
{
con.push_front(con.back());
con.pop_back();
naegu.push_front(naegu.back());
naegu.pop_back();
con[n - 1] = false; // 아래 줄로 가면 로보트는 사라지므로!
}
//로보트의 이동
void move()
{
// 가장 먼저 올라간 로봇부터 움직이니 i--
for (int i = n - 2; i >= 0; i--)
{
// 컨베이어 벨트에 로봇이 있고, 다음 칸에 로봇이 없고, 내구도가 0보다 크고
if ((con[i]) && (!con[i + 1]) && (naegu[i + 1] > 0))
{
con[i] = false;
con[i + 1] = true;
naegu[i + 1]--;
}
con[n - 1] = false; // 아래 줄로 가면 로보트는 사라지므로!
}
}
void put_robot()
{
if (!con[0] && naegu[0] > 0)
{
con[0] = true;
naegu[0]--;
}
}
int check()
{
int cnt = 0;
for (int i = 0; i < 2 * n; i++)
{
if (naegu[i] == 0)
cnt++;
}
return cnt;
}
int main()
{
cin >> n >> k;
int ans = 1;
for (int i = 0; i < 2 * n; i++)
{
int x;
cin >> x;
naegu.push_back(x);
con.push_back(false);
}
while (true)
{
//단계대로 진행
rotate();
move();
put_robot();
int c = check();
//k 이상
if (c >= k)
{
cout << ans << '\n';
return 0;
}
ans++;
}
return 0;
}
|
cs |