문제풀이/Implementation

[PS] BOJ20055 컨베이어 벨트 위의 로봇 ( inplementation ) with JAVA

IT록흐 2023. 10. 26. 00:01
반응형

 

 

20055번: 컨베이어 벨트 위의 로봇

길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부

www.acmicpc.net

 

◎ 문제풀이

 

문제이해력과 구현력이 필요한 문제였다. 

 

 

 

자료구조는 2개를 만들어 준다.

 

1) 컨베이어 벨트 ( int 배열 , 내구도 )

2) 로봇위치 ( boolean 배열, 로봇 존재 여부 )

 

문제에 주어진 단계에 따라 차근히 구현하면 된다. 

 

1) 벨트 이동하기 

 

벨트가 한 칸 움직일때마다, 우측으로 값을 복사한다. 맨끝은 가장 처음으로 복사한다. 

 

 

 

 

벨트 자료구조를 우측으로 값을 복사하였다.  벨트 위에 있는 로봇도 함께 우측으로 이동한다. 

 

2) 로봇 이동하기

 

이제는 벨트와 별개로 로봇이 스스로 이동해야 한다.

로봇의 우측이동은 조건이 있다. 

 

1) 벨트의 내구도가 1 이상이어야 한다.

2) 이동할 벨트에 로봇이 없어야 이동이 가능하다.  

 

조건에 부합한 경우에만 우측으로 값을 복사한다.

 

3) 로봇 올려놓기

 

이동이 완료되면 로봇을 올려놓는다. 

벨트의 자료구조의 인덱스0 자리의 내구도가 1이상이고 로봇이 없으면 로봇을 올려놓는다.

 

4) 벨트 내구성 체크하기

 

벨트의 내구성이 0인 칸이 k개 이상이면 회전을 멈춘다. 반복문으로 개수를 카운트한다.

 

◎ 코드

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

//BOJ20055 컨베이어 벨트 위의 로봇
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[] belt = new int[2*n];
        boolean[] robot = new boolean[n];

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

        int ans = 1;
        while(true){

            //1. 벨트 이동하기
            int tmp = belt[belt.length-1];
            for(int i=belt.length-1;i>0;i--){
                belt[i] = belt[i-1];
            }
            belt[0] = tmp;

            // 벨트가 이동하면 벨트 위에 있는 로봇도 함께 움직인다.
            for(int i=robot.length-1;i>0;i--){
                robot[i]=robot[i-1];
            }
            robot[0] = false;

            // 2. 로봇 이동하기
            robot[robot.length-1] = false; //내리는 지점에 로봇 내리기
            for(int i=robot.length-1;i>0;i--){
                if(robot[i-1]&& !robot[i] && belt[i]!=0){
                    robot[i] = true; // 로봇 이동 : true
                    robot[i-1] = false; // 로봇 떠남 : false
                    belt[i]--; // 이동한 칸 내구도 감소 : -1
                }
            }

            //3. 로봇 올리기 ( 인덱스 0 )
            if(belt[0] != 0){
                robot[0] = true;
                belt[0]--;
            }

            //4. 벨트 내구성 체크하기
            int count = 0;
            for(int i=0;i<belt.length;i++){
                if(belt[i] == 0) count++;
            }
            if(count >= k) break;
            else ans++;
        }

        // 답 출력
        System.out.println(ans);

    }


}

 

반응형