풀면서 생각한것들
로봇을 내리는 때는 두 번 있다.
처음에는 벨트를 돌린 이후 바로 내리는것이 아닌 로봇을 움직이고나서 내리도록 구현해서, 원래 움직일 수 있었던 로봇들이 움직이지 못하는 경우가 생겼다.
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);
}
}
Plain Text
복사