최코딩의 개발

[백준] 컨베이어 벨트 위의 로봇 20055번(🥇골드5) 본문

코딩테스트/백준

[백준] 컨베이어 벨트 위의 로봇 20055번(🥇골드5)

seung_ho_choi.s 2024. 5. 16. 00:16
728x90

사이트

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

 

문제

분석

문제만 잘이해한다면 어렵지 않은 문제다!! 

이해하는데만 30분걸림.. 제대로 안읽어서 ㅜㅜㅜ

 

문제의 핵심은 내구도이다!!

 

문제의 이해를 돕기 위해 아래를 참고해보자

 

이해

입력 부분:  n은 컨테이너 가로 칸 갯수, k는 내구도가 0인 칸(조건) ex) 만약 내구도가 0인 칸이 k개 이상이면 종료!! 

마지막으로 두번째 입력부분은  n*2개 칸의 내구도를 입력하는 부분이다. 

3 2
1 2 1 2 1 2

 

입력은 위와 같이 받을것이다!!

 

참고로 두번째 입력부분에서  1 2 1 2 1 2 이렇게 입력받는데 실제 그림은

1 2 1

2 1 2 이다. 음 다시 말해서 만약 1 2 3 4 5 6 이렇게 입력받으면 실제 그림은

 

1 2 3

6 5 4 라는 것이다! 필자는 이렇게 구현함! 즉 헷갈리지 말자! (이따 코드에서 볼거임) 

 

 

자 그럼 문제 이해는 위 사진을 참고하면 될것이다.!! 

 

참고로 칸이

1 2 3

6 5 4 가 있으면 로봇을 올리는 칸은 1이며, 로봇을 내리는 칸은 3이다!!! 주의!! 필자는 6이 내리는 칸인줄.. 

 

코드 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());

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

 

여기는 입력을 받는 부분이다.

필자가 앞서 말했듯이 n번째 즉 절반 이 후 부터는 거꾸로 저장을 해야 되기때문에 위와 같이 하였다.

 

이제 solution 함수를 호출해주고 while 문으로 들어온다. 

 

1번 조건

// 컨베이트 벨트 이동
int u_temp = arr[n - 1];
int d_temp = arr[n];

for (int i = n - 2; i >= 0; i--) {
    arr[i + 1] = arr[i];
}
for (int i = n; i < 2 * n - 1; i++) {
    arr[i] = arr[i + 1];
}
arr[0] = d_temp;
arr[n * 2 - 1] = u_temp;

 

1번 조건에 따라 컨베이너 벨트가 이동한다.

이때 주의할점은 맨 끝에서부터 옮겨야된다. 그래야지 중간값이 분실이 안된다.

// 컨베이트 벨트에서 로봇도 이동
for (int i = n - 2; i >= 0; i--) {
    if (robot[i] != 0) {
        robot[i + 1] = robot[i];
        robot[i] = 0;
    }
}

 

컨베이너 벨트도 이동했으므로 동시에 그 위에 로봇도 있으면 같이 이동한다. 

 

2번 조건 

// n번째 로봇 퇴출
robot[n - 1] = 0;

//로봇 자체적으로 한칸이동
for (int i = n - 2; i >= 0; i--) {
    if (robot[i] != 0 && robot[i + 1] == 0 && arr[i + 1] > 0) {
        robot[i + 1] = robot[i];
        robot[i] = 0;
        arr[i + 1] -= 1;

    }
}

 

2번 조건에 따라 로봇이 자체적으로 한 칸 이동함과 동시에 n번째 자리에 오면 0으로 만들어 퇴출 시켜버린다. 

또한 이동하는 칸의 내구가 1이상일때만 움직일 수 있으므로 위와같이 if문으로 조건을 걸어 두었다. 

 

3번 조건

// 로봇 탑승
if (arr[0] > 0 && robot[0] == 0) {
    arr[0] -= 1;
    robot[0] = 1;
}

3번 조건에 따라 로봇을 탑승시킨다.

이때 올리는 칸에 로봇이 있거나 동시에 내구도가 0일시 탑승을 못하는 if문 조건을 걸어 두었다.  

 

4번 조건

int strong = 0;
for (int i : arr) {
    if (i <= 0) {
        strong++;
    }
}
if (strong >= k) {
    a = false;
}

 

4번 조건이다. 조건 k가 만족할때  while 을 false로 만든 뒤  변수 level 값 출력!! 

 

 

전체코드

package implement;

import java.util.*;
import java.io.*;

public class Implement20055 {
    static int n;

    static int k;

    static int[] arr;

    static int level = 0;

    static int[] robot;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());

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

        solution();
        System.out.println(level);
    }

    private static void solution() {
        boolean a = true;
        while (a) {
            level++;
            // 컨베이트 벨트 이동
            int u_temp = arr[n - 1];
            int d_temp = arr[n];

            for (int i = n - 2; i >= 0; i--) {
                arr[i + 1] = arr[i];
            }
            for (int i = n; i < 2 * n - 1; i++) {
                arr[i] = arr[i + 1];
            }
            arr[0] = d_temp;
            arr[n * 2 - 1] = u_temp;


            // 컨베이트 벨트에서 로봇도 이동
            for (int i = n - 2; i >= 0; i--) {
                if (robot[i] != 0) {
                    robot[i + 1] = robot[i];
                    robot[i] = 0;
                }
            }

            // n번째 로봇 퇴출
            robot[n - 1] = 0;

            //로봇 자체적으로 한칸이동
            for (int i = n - 2; i >= 0; i--) {
                if (robot[i] != 0 && robot[i + 1] == 0 && arr[i + 1] > 0) {
                    robot[i + 1] = robot[i];
                    robot[i] = 0;
                    arr[i + 1] -= 1;

                }
            }

            // 로봇 탑승
            if (arr[0] > 0 && robot[0] == 0) {
                arr[0] -= 1;
                robot[0] = 1;
            }

            int strong = 0;
            for (int i : arr) {
                if (i <= 0) {
                    strong++;
                }
            }
            if (strong >= k) {
                a = false;
            }


        }
    }
}

결과

느낀점

오랜만에 한번에 맞힌 골드 문제다!! 처음에 문제 이해가 안되서 고민을 많이 했다... 단계 기준을 어디서 시작해야되는지,.

그치만 문제에 다 적혀있었다... 역시 코테는 구현하고 그래프 문제가 가장 쉬운거 같다! 

 

728x90