반응형
SMALL
제가 워낙 난독이 심하고, 머리도 나빠서 문제를 잘 못 이해하고 풀었네요.
끙..
이해력 좀 늘려야 할 것 같습니다.
좀 명시적으로 알려줬으면 하는 부분이 있는데, 다음과 같습니다.
1. 컨베이어 벨트가 움직이면, 로봇도 움직인다.
2. 벨트로 움직이든, 로봇 자체가 움직이던 마지막 위치에 도달하는 로봇은 반드시 하차해야한다.
3. 로봇 자체가 움직이는 경우, 새로운 로봇이 놓여지는 경우에만 해당 위치의 내구도가 1 감소한다.
위 3가지만 주의하면 나머지는 문제만 봐도 이해 되는 수준이라서 다들 푸실 수 있을거 같네요.
#include <stdio.h>
int N, K, bad, cnt;
int up[1000 + 3];
int down[1000 + 3];
int queue[1000 * 1000];
int head, tail;
void init() {
scanf("%d %d", &N, &K);
for (int n = 0; n < N; ++n) scanf("%d", &up[n]);
for (int n = N - 1; n >= 0; --n) scanf("%d", &down[n]);
}
void rotation() {
// 벨트 회전
int tmp = up[N - 1];
for (int n = N - 1; n >= 1; --n) up[n] = up[n - 1];
up[0] = down[0];
for (int n = 0; n < N - 1; ++n) down[n] = down[n + 1];
down[N - 1] = tmp;
// 벨트 위 로봇도 회전
for (int i = head; i < tail; ++i) {
queue[i]++;
// 이동 후 마지막에 있는 애는 내려준다.
if (queue[i] == N - 1) head++;
}
}
bool checkBox(int target) {
// 특정 위치에 로봇이 있는지 확인하는 함수
int flag = true;
for (int i = head; i < tail; ++i) {
if (queue[i] == target) flag = false;
}
return flag;
}
void move() {
int idx;
for (int i = head; i < tail; ++i) {
idx = queue[i];
// 다음 위치의 내구도가 0보다 크고, 그 위치에 아무 것도 없으면
if (up[idx + 1] > 0 && checkBox(idx + 1)) {
// 로봇 이동
queue[i] += 1;
// 그 위치 내구도 깎고
up[queue[i]]--;
// 이동 후 마지막에 있는 애면 내려준다.
if (queue[i] == N - 1) head++;
}
}
}
void set() {
bool flag = true;
for (int i = head; i < tail; ++i) {
if (queue[i] == 0) flag = false;
}
// 첫 번째 위치에 로봇이 없고, 내구도가 1 이상이면 로봇 설치
if (flag && up[0] != 0) {
queue[tail++] = 0;
up[0]--;
}
}
void checkBad() {
// 전체 내구도 확인 함수
bad = 0;
for (int n = 0; n < N; ++n) {
if (up[n] == 0) bad++;
if (down[n] == 0) bad++;
}
}
int main(void) {
init();
while (bad < K) {
cnt++;
rotation();
move();
set();
checkBad();
}
printf("%d", cnt);
return 0;
}
이상 20055 - 컨베이어 벨트 위의 로봇였습니다. ^_^
반응형
LIST
'알고리즘 문제 풀이 > Baekjoon' 카테고리의 다른 글
15683 - 감시 (0) | 2021.04.13 |
---|---|
14501 - 퇴사 (4) | 2021.04.13 |
1916 - 최소비용 구하기 (0) | 2021.04.11 |
1753 - 최단경로 (0) | 2021.04.10 |
3425, 5373 - 고스택, 큐빙 / 구현능력문제 (0) | 2020.03.29 |