코딩문제풀이/Baekjoon

[Java] 백준 20055번 : 컨베이어 벨트 위의 로봇

코딩하는 포메라니안 2023. 1. 2. 18:11

1. 문제

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

 

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

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

www.acmicpc.net

 

 

2. 풀이 과정

처음에 문제를 이해하는 게 제일 어려웠다.

결국 처음 풀 때는 문제를 완전히 이해하지 못하고 풀어 비효율적인 풀이였지만 통과는 했었다.

 

헷갈렸던 부분은 두 가지였다.

첫 번째는 컨베이어 벨트의 번호는 컨베이어 벨트가 회전할 때 같이 움직이는 것이고, 올리는 위치 내리는 위치는 그림 속처럼 시작점부터 0번째 N번째 위치를 의미한다.

두 번째는 로봇이 있을 수 있는 위치였다. 컨베이어 벨트가 회전 초밥처럼 타원형이 아니라 윗 라인에만 로봇을 둘 수 있는 형태이다.

 

푸는 건, 문제에서 순서대로 코드를 작성해주면 된다.

우선 컨베이어벨트의 내구도를 기록하는 배열, 윗 라인에 로봇이 있는지 여부를 기록할 배열 2개를 선언한다.1. 벨트를 for문을 이용해 한 칸씩 움직여준다.2. 벨트의 이동을 고려해 N-1, N-2번째에 있는 로봇을 내려준다.4. 로봇을 움직일 때, 앞단계에서 벨트가 이동한 한 칸을 고려해 이동할 수 있으면 2칸을 이동할 수 없으면 1칸을 움직이도록한다.5. 시작점에 로봇을 올릴 수 있으면 올린다.6. K가 0보다 작으면 종료한다. 

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

public class Main {
    static int N, K, belt[]; //--K==0이면 종료
    static boolean robots[];
    
    public static int simulation(){
        int step = 0;

        while(K > 0){
            step ++;

            //1
            int temp = belt[2*N-1];
            for(int i=2*N-1; i>0; i--){
                belt[i] = belt[i-1];
            }
            belt[0] = temp;

            //2
            robots[N-1] = robots[N-2] = false;
            for(int i=N-1; i>1 ; i--){
                if(!robots[i-2] || robots[i] || belt[i] <= 0){ 
                    if(robots[i-2]){
                        robots[i-1] = true;
                        robots[i-2] = false;
                    }
                    continue;
                }
                robots[i] = true;
                robots[i-2] = false;
                if(--belt[i] == 0){
                    K--;
                }
            }

            //3
            if(!robots[0] && belt[0] > 0){
                robots[0] = true;
                if(--belt[0] == 0){
                    K--;
                }
            }
        }

        return step;
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());
        belt = new int[2*N];
        robots = new boolean[N];

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

        System.out.println(simulation());
    }
}

 

 

결과