반응형
문제
풀이
구현 / 시뮬레이션 문제입니다.
생각보다 코드 구현과정이 어려웠는데, 문제 난이도인 골드 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 |