문제
https://www.acmicpc.net/problem/20055
풀이
조건대로 차례대로 구현하면 됐다.
- 컨베이어 벨트를 회전시킨다.
1-1 N위치에 로봇이 있다면 로봇을 내린다. - 로봇을 이동시킨다.
2-1 N위치에 로봇이 있다면 로봇을 내린다.
2-2 로봇이 이동할 때 내구도를 1 감소시킨다. - 1위치에 로봇을 올린다.
3-1 1위치에 로봇을 올릴 때 내구도를 1 감소시킨다. - 종료조건을 확인한다.
코드
#include <iostream>
using namespace std;
struct can {
bool onRobot;
int left;
};
int N, K;
can A[1001];
void rotateA() {
can temp = A[N * 2 - 1];
for(int i=N * 2-1;i>=0;--i) {
A[i] = A[i-1];
}
A[0] = temp;
if(A[N-1].onRobot) {
A[N-1].onRobot = false;
}
}
void move() {
for(int i=N - 2;i>=0;--i) {
if(A[i].onRobot) {
int nextIdx = i + 1;
if(!A[nextIdx].onRobot && A[nextIdx].left != 0) {
if(nextIdx == N-1) {
A[i].onRobot = false;
A[nextIdx].left--;
continue;
}
A[i].onRobot = false;
A[nextIdx].onRobot = true;
A[nextIdx].left--;
}
}
}
}
void pushRobot() {
if(!A[0].onRobot && A[0].left != 0) {
A[0].onRobot = true;
A[0].left--;
}
}
int cntEmptyCan() {
int ret = 0;
for(int i=0;i<N * 2;++i) {
if(A[i].left == 0) {
ret++;
}
}
return ret;
}
void printLeft() {
cout << "PL" << endl;
for(int i=0;i<N * 2;++i) {
cout << A[i].left << ' ';
}
cout << endl;
for(int i=0;i<N * 2;++i) {
cout << A[i].onRobot<< ' ';
}
cout << endl;
}
int main(void) {
cin >> N >> K;
for(int i=0;i<N * 2;++i) {
cin >> A[i].left;
A[i].onRobot = false;
}
int ans = 1;
while(true) {
rotateA();
move();
pushRobot();
if(cntEmptyCan() >= K) {
cout << ans;
return 0;
}
ans++;
}
return 0;
}
'알고리즘' 카테고리의 다른 글
[프로그래머스] 뉴스클러스터링 (0) | 2021.01.07 |
---|---|
[프로그래머스] 124 나라의 숫자 자바스크립트 (0) | 2021.01.06 |
Codility - MinAbsSumOfTwo (0) | 2020.12.30 |
백준 4902 삼각형의 값 c++ (0) | 2020.09.17 |
백준 2916 자와 각도기 c++ (0) | 2020.09.15 |