코딩 테스트/삼성 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";
}
하지만 다시 한 번 말한다. 풀지마라...ㅠㅠㅠ