이번에 풀어본 문제는
백준 20055번 컨베이어 벨트 위의 로봇 입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
class Belt
{
boolean hasRobot;
int durability;
public Belt(int durability)
{
this.durability = durability;
}
public void setBox()
{
this.hasRobot = true;
this.durability--;
}
public void getBox()
{
this.hasRobot = false;
}
}
public class Main {
static int N,K;
static int zero_cnt;
static List<Belt> belt;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
belt = new LinkedList<>();
for(int i = 0; i < N*2; ++i) belt.add(new Belt(Integer.parseInt(st.nextToken())));
int remove_point = N-1;
int last_idx = (N*2)-1;
int t = 0;
while(zero_cnt < K)
{
t++;
//벨트 회전
belt.add(0,belt.remove(last_idx));
if(belt.get(remove_point).hasRobot) belt.get(remove_point).getBox();
for(int i = last_idx-1; i > 0; --i)
{
Belt cur = belt.get(i);
if(cur.hasRobot)
{
Belt next = belt.get(i+1);
if(!next.hasRobot && next.durability > 0)
{
if(i+1 == remove_point)
{
next.durability--;
}
else
{
next.setBox();
}
cur.getBox();
if(next.durability == 0) zero_cnt++;
}
}
}
Belt fst = belt.get(0);
if(fst.durability > 0)
{
fst.setBox();
if(fst.durability == 0) zero_cnt++;
}
}
System.out.print(t);
}
}
회전하는 컨베이어 벨트에서 로봇이 같이 이동하는 문제입니다. 로봇이 이동할 때 마다 벨트의 내구도가 감소하며, 내구도가 0인 갯수가 K개일때 반복이 종료되는 문제입니다.
첫 번째 칸은 매 반복마다 내구도가 1 이상일경우 새로운 로봇이 올려지며, N번째 칸에 로봇이 올려질 경우 바로 내려놓습니다. 벨트의 회전에 따라 리스트가 반복 때마다 한 칸씩 밀리므로 LinkedList를 사용했고, 각 인덱스마다 로봇의 유무와 내구도를 지니고 있도록 만들었습니다. 로봇이 이동할때, 올려질 때 각 인덱스의 내구도값을 체크하여 0이 되었을 경우 zero_cnt값을 올려주어 다음 반복에 도달했을 때, 이 값과 K 값을 비교하여 반복문을 벗어날 수 있도록 했습니다.
문제의 복잡한 설명을 이해하기만 하면 구현은 쉬운 문제입니다.
이유는 모르겠지만 다른 조건에 꽂혀서 내리는 위치를 2N이라고 생각하고 풀어서 도대체 왜 정답이 안나오는지 한참을 헤맸습니다..ㅋㅋ 문제를 잘 읽어보시길!!