본문 바로가기
알고리즘

자바 - 백준 20055 / 컨베이어 벨트 위의 로봇

by kdozlo 2023. 4. 13.

 

 

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

 

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

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

www.acmicpc.net

골드5

 

구현 방법

구현 문제라서 문제에 적힌대로 코드 작성하면 된다. 딱히 사용한 자료구조나 알고리즘도 없다.

  • 2 ≤ N ≤ 100
  • 1 ≤ K ≤ 2N
  • 1 ≤ Ai ≤ 1,000

조건도 위와 같아서 O(n^2)도 충분히 가능하다.

주의할 점은 로봇 위치 이동에 따라 로봇 올리는 곳과 로봇 내리는 곳 신경써서 구현해야 한다.

 

코드

package boj;

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

/**
 * 백준 20055
 * 컨베이어 벨트 위의 로봇
 * 골드 5
 * https://www.acmicpc.net/problem/20055
 */
public class Boj20055 {

    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[] a = new int[n * 2];
        Boolean[] location = new Boolean[n];
        Arrays.fill(location, false);

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

        int answer = 0;
        while(true) {
            answer++;

            int temp = a[2 * n - 1];
            //벨트 이동
            for(int i = 2 * n - 1; i > 0; i--) {
                a[i] = a[i - 1];
            }
            a[0] = temp;

            //벨트 이동에 따른 로봇 위치 이동
            for(int i = n - 1; i > 0; i--) {
                location[i] = location[i - 1];
            }
            location[0] = false;

            //내리는 곳에서 로봇 내리기
            location[n - 1] = false;

            //로봇 이동
            for (int i = n -1; i > 0; i--) {
                if(location[i - 1] && !location[i]) {
                    if(a[i] > 0) {
                        a[i]--;
                        location[i] = true;
                        location[i - 1] = false;
                    }
                }
            }

            //로봇 올리기
            if(!location[0] && a[0] > 0) {
                location[0] = true;
                a[0]--;
            }

            //로봇 내리기
            if (location[n -1]) {
                location[n - 1] = false;
            }

            int cnt = 0;
            for(int i = 0; i < 2 * n; i++) {
                if(a[i] == 0)
                    cnt++;
            }

            //종료 조건 확인
            if(cnt >= k)
                break;
        }

        System.out.println(answer);
    }
}

 

느낀 점

골드5라고 쫄지 말고 하면 된다!