풀면서 생각한것들

로봇을 내리는 때는 두 번 있다.

처음에는 벨트를 돌린 이후 바로 내리는것이 아닌 로봇을 움직이고나서 내리도록 구현해서, 원래 움직일 수 있었던 로봇들이 움직이지 못하는 경우가 생겼다.

  1. 가장 처음에 수행될 벨트 돌리기 후, 내리는 위치에 있는 로봇을 내려야 한다.
  2. 이후 로봇들이 한 칸씩 움직인 이후, 내리는 위치에 있는 로봇을 또 내려야 한다.

데크나 큐를 사용 할 수 없다.

컨베이어 벨트를 돌린다는것은 배열의 요소들을 한 칸씩 오른쪽으로 옮기는 행위다. 따라서 Queue나 Deque를 사용해서 poll -> 이후 바로 add와 같이 구현하려고 생각했지만, 해당 문제에서 큐나 데크를 사용하지 못하는 이유가 있다.

  1. 값을 변경해야한다. 로봇이 이동하는것을 boolean 배열처럼 구현하려고 했는데, 중간에 값들을 true나 false로 변경해야 한다. 벨트 각 칸의 내구도도 변화하는 값이기 때문에 마찬가지다.

위 두 가지만 조심하면 그다지 어렵지 않은 문제였다. 테스트 케이스도 잘 나와있어서, 예제만 통과하면 보통 맞는 문제.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        int[] stream = new int[2 * N];
        boolean[] is_robot = new boolean[2 * N];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < 2 * N; i++) stream[i] = Integer.parseInt(st.nextToken());
        int z_count = 0;
        int gen = 0;
        while (z_count < K)
        {
            int temp = stream[2 * N - 1];
            System.arraycopy(stream, 0, stream, 1, stream.length - 1);
            stream[0] = temp;
            boolean temp1 = is_robot[2 * N - 1];
            System.arraycopy(is_robot, 0, is_robot, 1, is_robot.length - 1);
            is_robot[0] = temp1;
            if (is_robot[N - 1]) is_robot[N - 1] = false;
            for (int i = N - 2; i >= 0; i--) {
                boolean elem = is_robot[i];
                if (elem && !is_robot[i + 1] && stream[i + 1] > 0) {
                    is_robot[i] = false;
                    is_robot[i + 1] = true;
                    stream[i + 1]--;
                    if (stream[i + 1] == 0) z_count++;
                }
            }
            if (is_robot[N - 1]) is_robot[N - 1] = false;
            if (stream[0] > 0) {
                is_robot[0] = true;
                stream[0]--;
                if (stream[0] == 0) z_count++;
            }
            gen++;
        }
        System.out.println(gen);
    }
}

제목 없는 데이터베이스