ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20055 - 컨베이어 벨트 위의 로봇
    Baekjoon 2022. 5. 24. 18:19

    풀면서 생각한것들

    로봇을 내리는 때는 두 번 있다.

    처음에는 벨트를 돌린 이후 바로 내리는것이 아닌 로봇을 움직이고나서 내리도록 구현해서, 원래 움직일 수 있었던 로봇들이 움직이지 못하는 경우가 생겼다.

     

    1. 가장 처음에 수행될 벨트 돌리기 후, 내리는 위치에 있는 로봇을 내려야 한다.
    2. 이후 로봇들이 한 칸씩 움직인 이후, 내리는 위치에 있는 로봇을 또 내려야 한다.

    데크나 큐를 사용 할 수 없다.

    컨베이어 벨트를 돌린다는것은 배열의 요소들을 한 칸씩 오른쪽으로 옮기는 행위다. 따라서 Queue나 Deque를 사용해서 poll -> 이후 바로 add와 같이 구현하려고 생각했지만, 해당 문제에서 큐나 데크를 사용하지 못하는 이유가 있다.

     

    1. 값을 변경해야한다. 로봇이 이동하는것을 boolean 배열처럼 구현하려고 했는데, 중간에 값들을 true나 false로 변경해야 한다. 벨트 각 칸의 내구도도 변화하는 값이기 때문에 마찬가지다.

    위 두 가지만 조심하면 그다지 어렵지 않은 문제였다. 테스트 케이스도 잘 나와있어서, 예제만 통과하면 보통 맞는 문제.

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.*;
    
    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[] stream = new int[2 * N];
            boolean[] is_robot = new boolean[2 * N];
            st = new StringTokenizer(br.readLine());
            for (int i = 0; i < 2 * N; i++) stream[i] = Integer.parseInt(st.nextToken());
            int z_count = 0;
            int gen = 0;
            while (z_count < K)
            {
                int temp = stream[2 * N - 1];
                System.arraycopy(stream, 0, stream, 1, stream.length - 1);
                stream[0] = temp;
                boolean temp1 = is_robot[2 * N - 1];
                System.arraycopy(is_robot, 0, is_robot, 1, is_robot.length - 1);
                is_robot[0] = temp1;
                if (is_robot[N - 1]) is_robot[N - 1] = false;
                for (int i = N - 2; i >= 0; i--) {
                    boolean elem = is_robot[i];
                    if (elem && !is_robot[i + 1] && stream[i + 1] > 0) {
                        is_robot[i] = false;
                        is_robot[i + 1] = true;
                        stream[i + 1]--;
                        if (stream[i + 1] == 0) z_count++;
                    }
                }
                if (is_robot[N - 1]) is_robot[N - 1] = false;
                if (stream[0] > 0) {
                    is_robot[0] = true;
                    stream[0]--;
                    if (stream[0] == 0) z_count++;
                }
                gen++;
            }
            System.out.println(gen);
        }
    }
    제출 번호 아이디 문제 문제 제목 결과 메모리 시간 언어 코드 길이 제출한 시간
    43725901 kjy0349 20055 컨베이어 벨트 위의 로봇 맞았습니다!! 19508 268 Java 11 1768 1시간 전

    'Baekjoon' 카테고리의 다른 글

    16197 - 두 동전  (0) 2022.05.28
    14888, 15685 - 연산자 끼워넣기 (1), (2)  (0) 2022.05.26
    1261 - 알고 스팟  (0) 2022.04.22
    13549 - 숨바꼭질 3  (0) 2022.04.22
    14226 - 이모티콘  (0) 2022.04.20
Designed by Tistory.