백준 컨베이어 벨트 위의 로봇

KIMYEONGJUN·2026년 3월 26일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 N, K가 주어진다. 둘째 줄에는 A1, A2, ..., A2N이 주어진다.

몇 번째 단계가 진행 중일때 종료되었는지 출력한다.

내가 이 문제를 보고 생각해본 부분

durability 배열은 벨트 각 칸의 내구도를 저장한다. 
길이는 2N이다.
robots 배열은 로봇 존재 여부를 저장하는데 길이는 N이다. 
로봇은 오직 올리는 위치(0)부터 내리는 위치(N - 1)까지 위에서만 존재한다.
벨트 회전 시 내구도 배열을 한 칸씩 오른쪽으로 밀고, 로봇 위치도 한 칸씩 이동시키며 내리는 칸에서 내린 로봇은 제거합니다.
로봇 이동은 내리는 위치 바로 전 칸부터 역순으로 탐색하며 가능하면 1칸 앞으로 이동시킵니다. 이동하면 내구도가 1 줄고, 내리는 칸에 도착하면 바로 내립니다.
올리는 위치 로봇 올리기는 내구도가 남아 있을 때만 올리고 내구도를 깎습니다.
종료 조건은 내구도가 0인 칸이 K 이상이면 현재 단계를 출력하고 종료합니다.

코드로 구현

package baekjoon.baekjoon_33;

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

// 백준 20055번 문제
public class Main1338 {
    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[] durability = new int[2 * N];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < 2 * N; i++) {
            durability[i] = Integer.parseInt(st.nextToken());
        }

        boolean[] robots = new boolean[N]; // 로봇은 올리는 위치(0번부터 N-1번 칸만 관리)
        int step = 0;

        while (true) {
            step++;

            // 1. 벨트와 로봇 한 칸 회전
            // 벨트 회전
            int lastDurability = durability[2 * N -1];
            System.arraycopy(durability, 0, durability, 1, 2 * N -1);
            durability[0] = lastDurability;

            // 로봇 회전 (오른쪽으로 한 칸 이동)
            for (int i = N - 1; i > 0; i--) {
                robots[i] = robots[i - 1];
            }
            robots[0] = false; // 올리는 위치에 새로 올라갈 수 있으니 초기화
            robots[N - 1] = false; // 내리는 위치에 도착하면 내림

            // 2. 로봇이 한 칸씩 이동
            for (int i = N - 2; i >= 0; i--) {
                if (robots[i] && !robots[i + 1] && durability[i + 1] > 0) {
                    robots[i] = false;
                    if (i + 1 != N - 1) { // 내리는 위치가 아니면 이동
                        robots[i + 1] = true;
                    }
                    durability[i + 1]--;
                }
            }
            robots[N - 1] = false; // 내리는 위치 도착시 로봇 내림

            // 3. 올리는 위치에 로봇 올리기 (내구도 0 아니면)
            if (durability[0] > 0) {
                robots[0] = true;
                durability[0]--;
            }

            // 4. 내구도 0인 칸 개수 세기
            int zeroDurabilityCount = 0;
            for (int i = 0; i < 2 * N; i++) {
                if (durability[i] == 0) zeroDurabilityCount++;
            }

            if (zeroDurabilityCount >= K) {
                System.out.println(step);
                break;
            }
        }

        br.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글