Coding Problem

[BOJ 20055] 컨베이어 벨트 위의 로봇

Yepchani 2025. 2. 20. 20:00
반응형

문제

컨베이어 벨트 위의 로봇

https://www.acmicpc.net/problem/20055

 

 

풀이

설명

작업이 종료되었을 때 몇 번째 단계가 진행중이었는지를 구하는 문제입니다.

 

작업 순서는 다음과 같습니다.

  1. 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전합니다.
  2. 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동합니다. 만약 이동할 수 없다면 가만히 있습니다.
    1. 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 합니다.
  3. 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올립니다.
  4. 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료합니다. 그렇지 않다면 1번으로 돌아갑니다.

 

예시 코드

function solution() {
  const [N, K] = input().split(" ").map(Number);
  const belt = input().split(" ").map(Number);
  const robots = Array(N).fill(false);
  let zeroCnt = 0;
  let step = 0;

  while (zeroCnt < K) {
    step++;

    // 1번
    belt.unshift(belt.pop());
    robots.unshift(robots.pop());
    robots[N - 1] = false;

    // 2번
    for (let i = N - 2; i >= 0; i--) {
      if (!robots[i]) continue;
      if (robots[i + 1]) continue;
      if (belt[i + 1] === 0) continue;

      robots[i] = false;
      robots[i + 1] = true;
      belt[i + 1]--;

      if (belt[i + 1] === 0) zeroCnt++;
    }
    robots[N - 1] = false;

    // 3번
    if (belt[0] > 0) {
      robots[0] = true;
      belt[0]--;
      if (belt[0] === 0) zeroCnt++;
    }
  }

  return step;
}

'Coding Problem' 카테고리의 다른 글

[BOJ 1965] 상자넣기  (0) 2025.02.22
[BOJ 14719] 빗물  (0) 2025.02.21
[BOJ 1343] 폴리오미노  (0) 2025.02.19
[BOJ 17413] 단어 뒤집기 2  (0) 2025.02.18
[BOJ 13413] 오셀로 재배치  (0) 2025.02.13