백준 20055 컨베이어 벨트 위의 로봇 (Java,자바)

jonghyukLee·2021년 11월 8일
0

이번에 풀어본 문제는
백준 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이라고 생각하고 풀어서 도대체 왜 정답이 안나오는지 한참을 헤맸습니다..ㅋㅋ 문제를 잘 읽어보시길!!

profile
머무르지 않기!

0개의 댓글