[C++] 백준 20055 : 컨베이어 벨트 위의 로봇
#include <iostream>
#include <deque> // 로봇 저장할 덱
using namespace std;
deque<int> belt; // 컨베이너 벨트 || 1이면 로봇 있는 것
deque<int> A; // 벨트 칸의 내구도
int cnt = 0; // 현재 내구도 0인 것 개수
int stage = 0; // 몇단계 진행중인지
int N, K; // 벨트 절반, 내구도 0 개수
int main(){
scanf("%d %d", &N, &K);
int x;
for(int i=0; i<N*2; i++){
scanf("%d", &x); // 내구도 값 입력받기
A.push_back(x);
belt.push_back(0);
}
while(cnt < K){
// 1. 벨트가 로봇과 함께 한 칸 회전
// 내구도도 함께 회전시킨다.
A.push_front(A.back());
A.pop_back();
belt.push_front(belt.back());
belt.pop_back();
// N번째 칸에 로봇 있으면 로봇 내리기
if(belt[N-1] == 1){
belt[N-1] = 0;
}
// 2. 가장 먼저 벨트에 올라간 로봇부터 한 칸 이동할 수 있으면 한 칸 이동
// 이동하려는 칸 위에 로봇 없고 내구도 1 이상
for(int i = 2 * N; i >= 0; i--){
if(belt[i] == 1 && A[i + 1] > 0 && belt[i + 1] != 1){
// 로봇 위치 이동
belt[i+1] = 1;
belt[i] = 0;
// 이동한 칸 내구도 -1
A[i+1]--;
}
if(belt[N-1] == 1){
belt[N-1] = 0; // N칸 도착시 빼기
}
}
//3. 올리는 위치(1) 칸 내구도 0 아니라면 로봇 올리기
// 올리는 위치에 로봇이 없을 경우도 추가
if(A[0] > 0 && belt[0] == 0){
belt[0] = 1; //로봇 올리기
A[0]--; // 로봇 올리는 것도 내구도 닮
}
//4. 내구도 0인 칸 수 K개 이상이면 종료
int tmp = 0;
for(int i=0; i<N*2; i++){
if(A[i] == 0){
tmp++;
}
}
if(tmp >= K){
cnt = tmp;
}
stage++;
}
printf("%d", stage);
return 0;
}
쉬웠던 시뮬레이션 문제. 그런데 은근 한 조건을 빼먹어서 꽤 애를 먹었다ㅜㅜ
-
꼼꼼히 문제를 보기, 로봇을 올리는 것도 내구도가 단다.
-
배열과 덱을 처음에는 혼용해서 사용하였는데 매우 비효율적이다. 배열로 컨베이너 벨트를, 덱을 로봇의 위치를 사용했는데 그냥 이런 컨베이터 벨트 문제는 다 덱을 사용하는게 덜 헷갈리고 편한 것 같다. 너무 많은 자료구조를 한 문제에 쓰지 말자.
-
덱도 배열처럼 index를 사용해서 접근할 수 있다.
-
코드가 100줄 이상이면 다시 생각해보자.
Author And Source
이 문제에 관하여([C++] 백준 20055 : 컨베이어 벨트 위의 로봇), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lamknh/C-백준-20055-컨베이어-벨트-위의-로봇저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)