[백준] 20055번 컨베이어 벨트위의 로봇 - Java, 자바

Kim Ji Eun·2022년 4월 25일
0
post-custom-banner

난이도

골드 5

문제

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

풀이

구현 문제

  1. 벨트가 각 칸 위에 있는 로봇과 함께 한칸 회전
           int tmp = A[A.length - 1];
            for (int i = A.length - 1; i > 0; i--) {
                A[i] = A[i - 1];
            }
            A[0] = tmp;

            for (int i = robot.length - 1; i > 0; i--) {
                robot[i] = robot[i - 1];
            }
            robot[0] = false; // 회전한다면 첫번째는 무조건 비게 됨
            robot[n - 1] = false; // 내리는 위치면 무조건 내리게 되므로 false
  1. 로봇 이동 (이동할 다음칸에 로봇 없으며, 그 칸의 내구도가 1이상 있을 때)
           for (int i = robot.length - 1; i > 0; i--) {
                if (robot[i - 1] && !robot[i] && A[i] >= 1) {
                    A[i]--; // 이동했으니 내구성 -- 
                    robot[i] = true;  // 로봇 생기고 
                    robot[i - 1] = false; // 이동한 자리 false
                }
            }
  1. 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇올림
        if (A[0] > 0) {
                robot[0] = true; //올리는 위치에 내구성 0 이상이면 로봇 올리기 
                A[0]--; // 로봇 이동했으니 내구성 감소 
            }
  1. 내구도가 0 칸의 개수가 k개 이상이라면 과정 종료
    private static boolean isOk() {
        // 4. 내구도가 0 칸의 개수가 k개 이상이라면 과정을 종료 , 그렇지 않다면 1번으로 돌아감
        int cnt = 0;
        for (int i = 0; i < A.length; i++) {
            if (A[i] == 0) {
                cnt++;
            }
            if (cnt >= k)
                return false;
        }
        return true;
    }

코드

package 삼성SW역량테스트기출문제;

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

public class BOJ20055 {
    static int n, k;
    static int[] A;
    static boolean[] robot;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());

        A = new int[2 * n];
        robot = new boolean[n];

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < A.length; i++) {
            A[i] = Integer.parseInt(st.nextToken());

        }

        System.out.println(simulation());

    }

    private static int simulation() {
        int cnt = 0;

        while (isOk()) {
            // 1. 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전
            int tmp = A[A.length - 1];
            for (int i = A.length - 1; i > 0; i--) {
                A[i] = A[i - 1];
            }
            A[0] = tmp;

            for (int i = robot.length - 1; i > 0; i--) {
                robot[i] = robot[i - 1];
            }
            robot[0] = false;
            robot[n - 1] = false;

            // 2. 가장 먼저 벨트에 올라간 로봇부터 벨트가 회전하는 방향으로 한칸 이동 가능
            // 로봇 이동위해 이동하려는 칸에 로봇없으며 그 칸의 내구도가 1이상 남아있어야함
            for (int i = robot.length - 1; i > 0; i--) {
                if (robot[i - 1] && !robot[i] && A[i] >= 1) {
                    A[i]--;
                    robot[i] = true;
                    robot[i - 1] = false;
                }
            }

            // 3. 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇 올림
            if (A[0] > 0) {
                robot[0] = true;
                A[0]--;
            }

            cnt++;
        }

        return cnt;
    }

    private static boolean isOk() {
        // 4. 내구도가 0 칸의 개수가 k개 이상이라면 과정을 종료 , 그렇지 않다면 1번으로 돌아감
        int cnt = 0;
        for (int i = 0; i < A.length; i++) {
            if (A[i] == 0) {
                cnt++;
            }
            if (cnt >= k)
                return false;
        }
        return true;
    }

}
profile
Back-End Developer
post-custom-banner

0개의 댓글