[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.)