본문 바로가기
코딩테스트

백준 20055 컨베이어 벨트위의 로봇 (구현)

by 희안 2021. 4. 14.

실버1등급 문제였다. 구현문제로 원하는 대로 구현해내면 성공하는 문제.

주의할 점은 로봇이 처음들어온 순서대로 처리되어야 하므로 queue를 사용해야 한다.

queue도 오랜만에 써봐서 중간값 변경 안되는거 헤맸다...

visit배열도 만들어줘서 현재 그 벨트에 로봇이 있는지 없는지 체크해줬다.

 

www.acmicpc.net/problem/20055

 

20055번: 컨베이어 벨트 위의 로봇

길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부

www.acmicpc.net

중간에 index 잘못설정해줘서 틀렸다... 역시 index 너무 헷갈린다.

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int n, k;
int container[210], visit[210]; 
queue<int> robot;
int start_, end_, count_;

void Input() {
	cin >> n >> k;
	for (int i = 0; i < 2 * n; i++) {
		cin >> container[i];
	}
	start_ = 0;
	end_ = n-1;

	count_ = 0;
}

void FirstStep() {
	start_--; end_--;
	if (start_ < 0) start_ = n * 2 - 1;
	if (end_ < 0) end_ = n * 2 - 1;
}

void SecondStep() {
	int size = robot.size();
	for (int i = 0; i < size; i++) {
		int cur = robot.front();
		visit[cur] = false;
		robot.pop();

		if (cur == end_) continue;
		int next = cur + 1;
		if (next >= 2 * n) next = 0;
		if (container[next] > 0 && visit[next] == 0) {
			container[next]--;
			if (next == end_) continue;
			visit[next] = 1;
			robot.push(next);

		}
		else {
			visit[cur] = 1;
			robot.push(cur);
		}

	}
}

void ThirdStep() {
	if (visit[start_] == 0 && container[start_] > 0) {
		visit[start_] = 1;
		container[start_]--;
		robot.push(start_);
	}
}

bool checkK() {
	int countK = 0;
	for (int i = 0; i < 2 * n; i++) {
		if (container[i] == 0) countK++;
		if (countK >= k) {
			return true;
		}
	}
	return false;
}

int main() {
	Input();

	bool endStep = false;
	while (1) {
		count_++;

		FirstStep();

		SecondStep();

		ThirdStep();

		endStep = checkK();
		if (endStep) {
			cout << count_;
			break;
		}
	}

	return 0;
}

'코딩테스트' 카테고리의 다른 글

백준 1110 더하기 사이클  (0) 2021.04.19
백준 2993 세부분  (0) 2021.04.15
백준 16639 평범한 배낭  (0) 2021.04.13
백준 17780 새로운 게임  (0) 2021.04.13
백준 17825 주사위 윷놀이  (0) 2021.04.08

댓글