Study hard
(c++)백준 20055번: 컨베이어 벨트 위의 로봇 본문
20055번: 컨베이어 벨트 위의 로봇
길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부
www.acmicpc.net
[풀이]
문제에 있는 순서대로 구현해주면 풀 수 있는 문제였다.
먼저 구조체 배열에 컨베이어 벨트 한 칸의 정보(로봇이 있는지, 해당 칸의 내구도)를 저장하는 것으로 시작하였다.
구현한 함수들
1. 벨트를 한 칸씩 회전시키는 함수
2. 로봇을 벨트가 회전하는 방향으로 한 칸씩 이동시키는 함수(이동할 수 있는 조건 有)
+1번 칸에 로봇 올리기
3. 내구도가 0인 칸의 개수가 K개 이상인지 세는 함수
※N번째 칸에 있는 로봇은 반드시 내려야 하기 때문에 1,2번 함수에 각각 처리해주었다.
#include <iostream>
using namespace std;
struct State {
bool robot;//로봇이 있는지
int d;//내구도
};
int N, K;
State belt[201];
bool Finish() {
int cnt = 0;
for (int i = 1; i <= N * 2; i++) {
if (belt[i].d == 0) {
cnt++;
}
}
if (cnt >= K)
return true;
else
return false;
}
//벨트 회전
void Rotate() {
State tmp = belt[2 * N];
for (int i = 2 * N - 1; i >= 1; i--) {
belt[i + 1] = belt[i];
}
belt[1] = tmp;
//마지막 칸에 로봇있으면 내려가기
if (belt[N].robot)
belt[N].robot = false;
}
//로봇 이동
void moveRobot() {
for (int i = N - 1; i >= 1; i--) {
//로봇이 있으면
if (belt[i].robot) {
//다음칸에 로봇이 없고 내구도가 1 이상 남아있으면
if (belt[i + 1].robot == false && belt[i + 1].d >= 1) {
//로봇 이동
belt[i + 1].robot = true;
belt[i + 1].d--;
belt[i].robot = false;
}
}
}
//마지막 칸에 로봇있으면 내려가기
if (belt[N].robot)
belt[N].robot = false;
}
int main() {
cin >> N >> K;
int a;
//내구도 저장
for (int i = 1; i <= 2 * N; i++) {
cin >> a;
belt[i] = { false,a };
}
int t = 0;
while (1) {
if (Finish())
break;
//벨트 회전
Rotate();
//로봇 이동
moveRobot();
//올라가는 위치에 로봇 없으면 로봇 올리기
if (belt[1].robot == false && belt[1].d >= 1) {
belt[1].robot = true;
belt[1].d--;
}
t++;
}
cout << t << '\n';
return 0;
}
'백준 > 시뮬레이션,구현' 카테고리의 다른 글
(c++)백준 20057번: 마법사 상어와 토네이도 (0) | 2021.03.26 |
---|---|
(c++)백준 20056번: 마법사 상어와 파이어볼 (0) | 2021.03.25 |
(c++)백준 16974번: 레벨 햄버거 (0) | 2021.03.10 |
(c++)백준 16939번: 2x2x2큐브 (0) | 2021.03.05 |
(c++)백준 17822번: 원판 돌리기 (0) | 2021.03.04 |