Algorithm

[BOJ-20055] 컨베이어 벨트 위의 로봇 - JAVA

이수밈 2025. 2. 23. 12:20

https://www.acmicpc.net/problem/20055

 

 

🐾 알고리즘

  • belt 배열 : 문제에 나와있는 벨트를 일렬로 생각하여 일차원 배열 형태로 만들었다. (처음에는 문제 그림대로 이차원 배열을 만들었는데, 문제를 더 꼬아서 생각하게 되어 비추..) 
  • robot 배열 : N번째에서 로봇을 내려주니 로봇이 이동할 수 있는 길이는 N 만큼이다. 
    • 매 스텝마다, N번째 칸에서 robot[N-1]=false로 만들어줘야한다. == 로봇 내려주는 과정
  • 1 step : 벨트를 한칸씩 이동시킨다.
  • 2 step : 로봇도 벨트가 이동하는 방향으로 이동시킨다. (다음칸의 내구성이 1이상이어야 함.)
  • 3 step : 1번째 칸에 로봇을 올려준다. (이 또한 1번째 칸의 내구성이 1이상 이어야함.)
  • 4 step : 한 사이클을 돌면 0의 개수를 체크해준다.

간단하다!ㅎㅎ


🐾 생각 포인트

  • 백준에 문제 지문이 이해하기 어렵게 되어있어서 오랫동안 헤맸다. 거의 3시간정도 삽질을 했다. 
    • 첫 시도는 다른사람들도 그렇듯이 로봇만 이동시켰는데, 알고보니 벨트도 이동시켜주는 거였다.
    • 문제 지문에 나와있는 4개의 스텝을 한 단계에 수행해 줘야 되는 거였다.
  • 이해하고 나면, 문제를 구현하기 쉬워진다. 1~4스텝을 구현해주면 되니까!
  • 그런데,,,, 또 마주한 난관은 왜 i를 0부터 반복하는 게 아니고 뒤에서부터 시작하여 반복하는 걸까.. 그림을 그리며 고민해보았다
    • 아하 한 칸씩 뒤로 밀리면서 계속해서 뒤 칸에 영향을 주게 된다. 그러므로 뒤에서부터 시작해서 한칸씩 땡기는 게 맞다!!!! (유레카였음 ㅠㅠㅠㅠㅠㅠ 이걸 몰라서 또 두시간 헤매주고)
//1단계: 한 칸 회전
            int tmp = belt[2*N-1];
            for(int i=belt.length-1;i>0;i--){
                belt[i] = belt[i-1];
            }
            belt[0] = tmp;
            for(int i=N-1;i>0;i--){
                robot[i] = robot[i-1];
            }
            robot[0] = false;
            robot[N-1] = false;

 


🐾 소스코드

package org.example;

import java.io.*;
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 ans = 1;

        st = new StringTokenizer(br.readLine());
        int[] belt = new int[2*N];
        boolean[] robot = new boolean[N];
        for (int i = 0; i < 2*N; i++) {
            belt[i] = Integer.parseInt(st.nextToken());
        }

        while(true){
            //1단계: 한 칸 회전
            int tmp = belt[2*N-1];
            for(int i=belt.length-1;i>0;i--){
                belt[i] = belt[i-1];
            }
            belt[0] = tmp;
            for(int i=N-1;i>0;i--){
                robot[i] = robot[i-1];
            }
            robot[0] = false;
            robot[N-1] = false;

            //2단계: 로봇 움직이기
            for(int i=N-1;i>0;i--){
                if(robot[i-1] && !robot[i]&&belt[i]>0){
                    robot[i-1] = false;
                    robot[i] = true;
                    belt[i]--;
                    robot[N-1] = false;
                }
            }

            //3단계: 로봇 올리기
            if(belt[0]>0){
                robot[0] = true;
                belt[0]--;
            }

            //4단계: 0 개수 체크
            int cnt = 0;
            for(int i = 0; i < belt.length; i++){
                if(belt[i] == 0){
                    cnt++;
                }
            }
            if(cnt >= K){
                break;
            }
            ans++;
        }
        System.out.println(ans);


    }
}

😵‍💫 공부해야 할 점

  • 열심히 삼성 기출 문제를 풀어야겠다. 뭔가 머리가 깨는 느낌이랄까..ㅋㅋㅋㅋㅋㅋㅋ 문제를 제대로 이해하고 나서 풀어야겠당