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);
}
}
😵💫 공부해야 할 점
- 열심히 삼성 기출 문제를 풀어야겠다. 뭔가 머리가 깨는 느낌이랄까..ㅋㅋㅋㅋㅋㅋㅋ 문제를 제대로 이해하고 나서 풀어야겠당