반응형
설명
문제 자체가 어렵진 않지만, 조건이나 설명이 헷갈린 문제였습니다.
컨베이어 벨트이고, N 이후에는 낭떠러지라고 생각하면 됩니다. 순환하는 원형이고 1~N까진 로봇이 존재할 수 있지만, N+1~2N까지는 존재 X
풀이
순서대로 진행하면
1. 과정에서 벨트와 로봇이 움직이게되는데, 이때 내리는 위치에 도달한 로봇은 즉시 내려갑니다. moveBelt()
2. 로봇이 앞에 칸에 내구도가 1이상이며, 로봇이 존재하지 않는다면 앞으로 이동하게 됩니다. 앞에 칸의 내구도는 -1. moveRobot()
3. 올리는 위치에 내구도가 1이상이면 로봇을 올려주고, 내구도를 -1 시켜줍니다. newRobot()
2,3번 과정에서 내구도가 -1되는 칸마다 0이 된 칸을 확인해주었습니다.
import java.io.*;
import java.util.*;
public class Main{
static int N, K, left, right, answer;
static int[] map;
static boolean[] robot;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st= new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
// 컨베이어 벨트 길이 2*N
map = new int[2*N];
// 로봇 위치 N
robot = new boolean[N];
st = new StringTokenizer(br.readLine(), " ");
for(int i = 0 ; i < 2*N ; i++) {
map[i] = Integer.parseInt(st.nextToken());
}
left = 0;
right = N;
while(K>0) {
answer++;
moveBelt();
moveRobot();
newRobot();
}
System.out.println(answer);
}
private static void moveBelt() {
left --;
if(left < 0) {
left = 2*N -1;
}
right --;
if(right < 0) {
right = 2*N - 1;
}
// 벨트가 움직임에 따라 로봇 위치 재조정 robot은 길이가 N, 0이되는 부분은 밑에서 올라와서 false, N-1도달하면 내리는 위치여서 false;
for(int i = N-2 ; i > 0 ; i--) {
robot[i] = robot[i-1];
}
robot[0] = false;
robot[N-1] = false;
}
private static void moveRobot() {
// 떨어지는위치 쪽이 올리는 위치보다 먼저 더 로봇이 올라갔으므로 뒤쪽을 먼저 옮겨야한다.
for(int i = N-2 ; i >= 0 ; i--) {
// 로봇이 있는 위치
if(robot[i]) {
// map배열 기준으로 left + i + 1
// 로봇배열 기준으로 N-2
int next = left + i + 1;
if(next >= 2*N) next -= 2*N;
if(!robot[i+1] && map[next] >=1) {
robot[i] = false;
if(i+1 < N-1) robot[i+1] = true;
map[next] --;
if(map[next] == 0) K--;
}
}
}
}
private static void newRobot() {
if(map[left] > 0) {
robot[0] = true;
map[left] --;
if(map[left] == 0) K--;
}
}
}
ref)
https://jellyinghead.tistory.com/69 - 참고하면서 이해가 잘 가지 않은 부분은 리팩토링 진행했습니다.
반응형
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[Java/자바 20056 백준] 마법사 상어와 파이어볼 (0) | 2022.01.06 |
---|---|
[Java/자바 백준 1520] 내리막 길 (0) | 2022.01.05 |
[Java/자바 백준 19238] 스타트 택시 (0) | 2022.01.04 |
[Java/자바 백준 2589] 보물섬 (0) | 2022.01.03 |
[Java/자바 백준 14503] 로봇 청소기 (0) | 2022.01.03 |