Study hard

(c++)백준 20055번: 컨베이어 벨트 위의 로봇 본문

백준/시뮬레이션,구현

(c++)백준 20055번: 컨베이어 벨트 위의 로봇

Nimgnoej 2021. 3. 24. 11:00

www.acmicpc.net/problem/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;
}