반응형
시뮬레이션 문제였습니다.
문제지문이 조금 이상해서 시간 단축을 위해 몇 가지 정보를 추가해보았습니다.
1. 로봇이 i에서 i + 1번째 칸으로 옮길때 i+1번째 칸만 내구도가 1감소합니다.
2. 로봇이 땅에 내려올 때 N번째 칸의 내구도는 감소하지않습니다.
Code
#include <bits/stdc++.h>
using namespace std;
int n,k;
//위층은 0 ~ n-1까지의 벨트
//아래층은 n ~ 2*n-1까지의 벨트
struct square{
int durability,robot;
};
void processOne(vector <square> &belt){
vector <square> tmp(2*n);
tmp[0].durability = belt[2*n-1].durability;
tmp[0].robot = belt[2*n-1].robot;
for(int i = 0; i < 2 * n - 1; i++){
tmp[i+1].durability = belt[i].durability;
tmp[i+1].robot = belt[i].robot;
}
belt = tmp;
if(belt[n-1].robot) belt[n-1].robot = 0;
}
void processTwo(vector <square> &belt){
vector<int>moved(2*n);
//n-1칸의 로봇은 이미 내린 상태 0 ~ n-1까지 옮겨주면됨
for(int i = n-2; i >= 0; i--){
//다음칸에 내구도 참이고 로봇이 없으면 옮겨줌.
if(belt[i].robot && !belt[i+1].robot && belt[i+1].durability){
belt[i+1].robot = 1;
belt[i].robot = 0;
if(belt[i+1].durability) belt[i+1].durability--;
}
}
belt[n-1].robot = 0;
};
void processThree(vector <square> &belt){
if(belt[0].durability && !belt[0].robot) {
belt[0].robot = 1;
belt[0].durability--;
}
};
int getZeroDuration(vector <square> &belt){
int cnt = 0;
for(auto b : belt){
if(!b.durability) cnt++;
}
return cnt;
}
int beltProcess(vector <square> &belt,int k){
int processNum = 0;
while(1){
processNum++;
processOne(belt); //회전
processTwo(belt);//로봇 이동
processThree(belt);//로봇 올리기
if(getZeroDuration(belt) >= k) break;//0내구도가 k개 이상이면
}
return processNum;
}
int main(){
cin >> n >> k;
vector <square> belt(2*n);
for(int i = 0; i < 2 * n; i++) {
int d;
cin >> d;
belt[i] = {d,0};
}
cout << beltProcess(belt,k) <<'\n';
}
'Algorithm > Implementation' 카테고리의 다른 글
(C++) - 백준(BOJ) 12100번 : 2048(Easy) (0) | 2021.03.24 |
---|---|
(C++) - 백준(BOJ) 15683번 : 감시 답 (0) | 2021.03.22 |
(C++) - 백준(BOJ) 3943번 : 헤일스톤 수열 (0) | 2021.03.16 |
(C++) - 백준(BOJ) 1713번 : 후보 추천하기 (0) | 2021.03.16 |
(C++) - 백준(BOJ) 1592번 : 영식이와 친구들 (0) | 2021.03.16 |