https://www.acmicpc.net/problem/20055
20055번: 컨베이어 벨트 위의 로봇
길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부
www.acmicpc.net
📌 작성한 코드
// 20055
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "Beakjoon/Gold/test.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const [N, K] = input[0].split(" ").map(Number);
let belt = input[1].split(" ").map(Number);
let robots = new Array(N).fill(false);
let idx = 0;
while (true) {
idx++;
belt.unshift(belt.pop());
robots.unshift(false);
robots.pop();
if (robots[N - 1]) robots[N - 1] = false;
for (let i = N - 1; i >= 0; i--) {
if (robots[i]) {
const next = i + 1;
if (belt[next] > 0 && !robots[next]) {
belt[next]--;
robots[next] = true;
robots[i] = false;
}
}
}
if (robots[N - 1]) robots[N - 1] = false;
if (belt[0] > 0) {
robots[0] = true;
belt[0] -= 1;
}
if (belt.filter((b) => b === 0).length >= K) break;
}
console.log(idx);
📌풀이
컨베이어 벨트를 움직이면서 내구도가 0이 된 컨베이어 벨트블럭이 K개가 될 때까지 몇 단계를 거쳐야 하는지 구하는 문제이다.
문제의 설명이 복잡해서 어렵게 느껴질 수 있지만 잘 이해하면 많이 어렵지 않은 문제이다. 아래 부분을 주의해서 코드를 작성해야 한다.
1. 컨베이어 벨트는 2*N의 길이이지만 로봇이 올라갈 수 있는 부분은 상위 부분인 1 ~ N까지의 블럭이다.
2. 로봇을 올려두기 위해서는 첫번째 블럭이 비어있으면서, 내구도가 1 이상이어야 한다.
3. 로봇이 N에 도달하면 바로 컨베이어 벨트에서 내려간다. (아예 제거된다)
4. 로봇을 움직이는 순서는 먼저 올라온 순서대로이다. (컨베이어 벨트 순이 아니라 그 역순으로 조사해야 먼저 올라온 순서대로 확인 가능하다.)
그리고 컨베이어 벨트와 로봇을 움직이는 순서도 정해져있으니 해당 순서대로 구현해나가면 된다.
(1) 벨트와 로봇이 함께 회전한다.
(2) 가장 먼저 올라간 로봇부터 오른쪽으로 1칸 이동하고 해당 벨트의 내구도를 1 감소시킨다. (단, 이동 가능한 경우에만)
(3) 1번 위치에 로봇을 올려두고 내구도를 1 감소시킨다. (단, 내구도가 있는 경우에만)
(4) 내구도가 0인 칸이 K개가 되면 이동을 종료한다.
(1) 벨트와 로봇이 함께 회전한다.
- 벨트의 마지막 내구도를 맨 앞으로 가져온다.
- 로봇은 현재 어떤 위치에 존재하는지만 확인하는 배열을 사용하고 있는데, N의 길이만 확인하고 있으니 마지막을 제거하고 맨 앞으로 로봇이 없다는 의미의 false를 채워주면 된다.
- 회전 한 후에 N의 위치(0부터 시작해서 N-1의 인덱스)에 도달한 로봇이 있다면 해당 로봇을 내린다.
idx++;
belt.unshift(belt.pop());
robots.unshift(false);
robots.pop();
(2) 가장 먼저 올라간 로봇부터 오른쪽으로 1칸 이동하고 해당 벨트의 내구도를 1 감소시킨다.
- 가장 먼저 올라간 로봇이라면 N에 가까운 로봇이 가장 먼저 올라간 로봇이기에 역순으로 로봇을 확인한다.
(2*N이 아니라 N을 확인하는 이유는 앞서 말했듯이 위에 있는 N개의 칸에만 로봇을 올릴 수 있기 때문이다. N에 도달하면 무조건 내리기 때문!)
- 해당 로봇이 이동할 다음 칸의 내구도가 남아있고, 다른 로봇이 존재하지 않는다면 이동한다.
- 회전 후에 N-1을 확인하고 로봇이 있다면 내린다.
for (let i = N - 1; i >= 0; i--) {
if (robots[i]) {
const next = i + 1;
if (belt[next] > 0 && !robots[next]) {
belt[next]--;
robots[next] = true;
robots[i] = false;
}
}
}
if (robots[N - 1]) robots[N - 1] = false;
(3) 1번 위치에 로봇을 올려두고 내구도를 1 감소시킨다. (단, 내구도가 있는 경우에만)
- 0 인덱스 위치의 내구도가 남아있다면 로봇을 올려준다.
if (belt[0] > 0) {
robots[0] = true;
belt[0] -= 1;
}
(4) 내구도가 0인 칸이 K개가 되면 이동을 종료한다.
if (belt.filter((b) => b === 0).length >= K) break;
✅ 성공

'알고리즘 > 백준' 카테고리의 다른 글
| [JavaScript] 백준 골드 5 : 21610 - 마법사 상어와 비바라기 (0) | 2024.02.13 |
|---|---|
| [JavaScript] 백준 골드 5 : 21608 - 상어 초등학교 (1) | 2024.02.13 |
| [JavaScript] 백준 골드 4 : 16234 - 인구 이동 (1) | 2024.02.11 |
| [JavaScript] 백준 골드 5 : 14891 - 톱니바퀴 (1) | 2024.02.11 |
| [JavaScript] 백준 골드 5 : 15686 - 치킨 배달 (1) | 2024.02.09 |