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

well-life-gm·2021년 11월 9일
0

백준 삼성

목록 보기
13/23

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

처음에 문제를 보고 이해가 잘 안되서 몇번 다시 읽어봤다..

먼저 step1은 컨베이어와 로봇을 둘 다 옮기는 단계이다.
컨베이어 벨트는 0~2N까지 다 옮겨야하고, N에서 항상 로봇이 내려가기 때문에 로봇은 0~N까지만 옮겨주면 된다.
또한 N번째에 존재하는 로봇은 내려줘야 한다.

다음으로 step2는 로봇을 다음 칸으로 옮겨주는 것인데, 이 때 칸의 내구도가 깍인다.
칸의 내구도가 깍일 때마다 0이 되면 zero_cnt를 늘려준다.

마지막으로 step3는 만약 내구도가 0이상 이라면 로봇을 올린다.
이 때 로봇이 존재하는지 여부는 체크할 필요가 없는데, step2를 거쳤기 때문에 이미 0번째에 로봇이 존재하지 않음을 항상 보장하기 때문이다.
만약 새로운 로봇이 올라오면 0번째 칸의 내구도가 깍이기 때문에 내구도가 0이 된지를 체크해주고 zero_cnt를 늘려준다.

3단계까지 거치고, zero_cnt가 k이상이라면 시뮬레이션을 종료한다.

코드는 아래와 같다.

#include <cstdio>
#include <iostream>
#include <vector>

using namespace std;

int n, k, n2;
int map[200];
int robot[200];
int zero_cnt;

const inline void step1()
{
	int tmp = map[n2 - 1];
	for (int i = n2 - 1; i > 0; i--) 
		map[i] = map[i - 1];
	map[0] = tmp;

	for (int i = n - 1; i > 0; i--) 
		robot[i] = robot[i - 1];
	robot[0] = 0;
	robot[n - 1] = 0;
}

const inline void step2()
{
	for (int i = n - 2; i >= 0; i--) {
		if (robot[i] == 0)
			continue;
		if (robot[i + 1] == 0 && map[i + 1] > 0) {
			robot[i + 1] = robot[i];
			robot[i] = 0;
			map[i + 1]--;
			if (map[i + 1] == 0)
				zero_cnt++;
		}
	}
	robot[n - 1] = 0;
}
const inline void step3()
{
	if (map[0] > 0) {
		robot[0] = 1;
		map[0]--;
		if (map[0] == 0)
			zero_cnt++;
	}
}

int main(void)
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	cin >> n >> k;
	n2 = (n << 1);
	for (int i = 0; i < n2; i++) 
		cin >> map[i];

	int iter = 1;
	while (1) {
		step1();
		step2();
		step3();
		if (zero_cnt >= k)
			break;
		iter++;
	}
	cout << iter << "\n";
	return 0;
}
profile
내가 보려고 만든 블로그

0개의 댓글

관련 채용 정보