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

이상민·2023년 8월 24일
0

알고리즘

목록 보기
26/128
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Robot_On_Conveyor_Belt {
    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 len = 2*N+1;
        int [] durable = new int[len];
        int [] robot = new int[len];
        st = new StringTokenizer(br.readLine());
        int count = 0;
        for (int i = 1; i < len; i++) {
            durable[i] = Integer.parseInt(st.nextToken());
        }

        int dangae = 1;
        int prerobot=0;
        while(true) {
            int pre = durable[len-1];
            int next;
            int nextrobot;
            for (int i = 0; i < len-1; i++) {// 로봇, 컨베이어 같이 회전
                next = durable[i+1];
                durable[i+1]= pre;
                pre = next;

                nextrobot = robot[i+1];
                robot[i+1] = prerobot;
                prerobot = nextrobot;
            }

            if(robot[N]==1){ // 로봇 내리는 위치에 있다면 내림
                robot[N]=0;
            }
            for(int i = N-1; i>=1; i--){// 로봇 이동

                if(robot[i]==1 && robot[i+1]==0 && durable[i+1]>0){
                    robot[i+1] = 1;
                    robot[i]=0;
                    durable[i+1] -= 1;
                    if(durable[i+1]==0) {
                        count++;
                    }
                }
            }
            if(robot[N]==1){// 로봇 내리는 위치에 있다면 내림
                robot[N]=0;
            }
            if(durable[1]>0){// 올리는 위치에 로봇 올림
                durable[1] -= 1;
                robot[1] = 1;
                prerobot = 0;
                if(durable[1]==0)
                    count++;

            }

            if (count >=K) {
                break;
            }
            dangae++;
        }
        System.out.println(dangae);
    }
}

풀이방법

📢이풀이의 핵심은 컨베이어 내구도 체크하는 배열, 로보트 유무를 체크하는 배열을 따로만들어서 같이 회전시키는 것이 핵심이다.

  1. 내구도 배열, 로봇배열을 같이 회전시킨다. 처음 pre는 항상 2N번째 칸의 값을 넣어준다.(로봇은 어차피 N번째에서 다 삭제되니 2N번째에서 첫번째로 돌아오는 경우는 생각하지 않는다.)
  2. 이때 N번째칸에 로보트가 있는지 확인한다.(있다면 로봇 삭제)
  3. 로봇을 이동시키는데 가장 처음 로봇 부터 이동하므로, 배열의 역순으로 탐색한다.
  • 현재칸에 로봇이 있는지
  • 다음 칸에 로봇이 없는지
  • 다음 칸의 내구도가 0보다 큰지 확인후 조건에 맞다면 로봇을 이동한다.
    -> 이때 이동한 칸의 내구도가 0이되면 count값을 증가시킨다.
  1. 이동 후에 또 N번째 칸에 로보트가 있는지 확인한다.
  2. 첫번째 칸에 내구도가 0보다 크다면 로봇을 추가한다.
    -> 이때 이동한 칸의 내구도가 0이 되면 count값을 증가시킨다.
  3. 5까지 끝나면 다음단계로 넘어간다.
  4. count값이 k가 될때까지 1,2,3,4,5,6을 반복한다.

📢 로봇이 움직일때(회전, 이동)마다 N번째칸을 확인하는것,
📢 내구도가 감소할때마다(로봇 놓을때, 이동할때) 0인지 확인하는것
이 두가지 조건을 주의하자

후기

아니 일단 난 2N번째에서 로봇 삭제시키는줄 알고 삽짏했다.
또 N번째에서 이게 삭제 시킨다는건지 N+1로 간다는건지 몇번을 문제를 다시 읽어도 모호하다. 이건좀 그렇네..
또 이게 map에 키,값형태로 묶어서 로봇이랑 내구도랑 같이 움직이게 할려했는데 그것도 못하겠다. 그렇게 어려운거 같진 않았는데 삽질 많이 한 문제다

profile
개린이

0개의 댓글