코딩 테스트/삼성 SW 역량 테스트 기출 문제

33. [백준 20055번 / C++] 컨베이어 벨트 위의 로봇

SeoKyung 2024. 4. 5. 15:22

https://www.acmicpc.net/problem/20055

 

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

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

www.acmicpc.net

 

결론부터 말하겠다. 풀지마라.

 

왜냐하면 이 문제는 너무 쉬운 구현문제지만, 문제 설명이 난이도를 올려놨다.

 

 

 

문제의 그림과 지문을 보자. 지문에서 '언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다' 라고 되어있다. 아하! N + 1로 내리는거구나~ 

 

아니다. 그림 상에서 컨베이어벨트 상으로 그렇게 생각하지만 이건 그냥 컨베이어 벨트가 이렇게 움직인다는거고, 로봇은 내리는 위치인 N번 칸에 도착하면 컨베이어 벨트에서 out이다. 걍 사라진다는 것.

 

이 점만 고려해서 문제의 내용을 구현하면 쉬울 것이다.

 

#include<bits/stdc++.h>
using namespace std;
int n, k, num, ret;
vector<int> a, b;

void rotate_robot(){
	if(b[2 * n - 1] == 1 && a[0] >= 1){
		b[0] = b[2 * n] = 1;
		b[2 * n - 1] = b[4 * n - 1] = 0;
		
		a[0] -= 1;
		a[2 * n] -= 1;
	}
	for(int i = 2 * n - 2; i >= 0; i--){
		if(b[i] == 1){
			if(b[i + 1] == 0 && a[i + 1] >= 1){
				b[i + 1] = b[i + 1 + 2 * n] = 1;
				b[i] = b[i + 2 * n] = 0;
				
				a[i + 1] -= 1;
				a[i + 1 + 2 * n] -= 1;
			}	
		}
	}
	if(b[n - 1] == 1 && a[n] >= 1){
		b[n - 1] = b[3 * n - 1] = 0;
	}
}
void on_robot(){
	if(a[0] >= 1){
		b[0] = b[2 * n] = 1;
		
		a[0] -= 1;
		a[2 * n] -= 1;
	}
}
bool check(){
	int cnt = 0;
	for(int i = 0; i < 2 * n; i++){
		if(a[i] == 0) cnt++;
	}
	if(cnt >= k) return true;
	else return false;
}
int main(){
	cin >> n >> k;
	for(int i = 0; i < 2 * n; i++){
		cin >> num;
		a.push_back(num);
		b.push_back(0);
	}
	for(int i = 0; i < 2 * n; i++){
		a.push_back(a[i]);
		b.push_back(0);
	}
	
	while(true){
		ret++;
		rotate(a.rbegin(), a.rbegin() + 1, a.rend());
		rotate(b.rbegin(), b.rbegin() + 1, b.rend());
		if(b[n - 1] == 1){
			b[n - 1] = b[3 * n - 1] = 0;
		}
		rotate_robot();
		on_robot();
		if(check()) break;
	}
	cout << ret << "\n";
}

 

 

하지만 다시 한 번 말한다. 풀지마라...ㅠㅠㅠ