본문 바로가기

Algorithm/BOJ

[BOJ-20055][시뮬레이션] 컨베이어 벨트 위의 로봇 - Java

문제 바로가기

 

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

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

www.acmicpc.net

 

2020 하반기 삼성전자 SW 역량테스트 문제입니다.

복기가 정말 빠르네용

시험에 쉽게 나와서 30분 컷 해서 다행이어씀다 ^^;;

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

public class Main {

    static int N, K;
    static int[] belt;
    public static void main(String[] args) throws IOException {
        input();

        System.out.println(solve());
    }

    public static int solve() {
        boolean[] robot = new boolean[N * 2];
        int zeroCnt = 0, time = 0;

        while(true) {
            time++;

            // 벨트 회전 + 로봇 이동
            int lastIdx = 2 * N - 1;
            int lastBelt = belt[lastIdx];
            for(int i = lastIdx; i > 0; i--) belt[i] = belt[i - 1];
            belt[0] = lastBelt;

            boolean lastRobot = robot[lastIdx];
            for(int i = lastIdx; i > 0; i--) robot[i] = robot[i - 1];
            robot[0] = lastRobot;

            if(robot[N - 1]) robot[N - 1] = false;

            // 로봇 이동
            for(int i = N - 2; i >= 0; i--) {
                if(!robot[i]) continue;
                if(belt[i + 1] > 0 && !robot[i + 1]) {
                    robot[i + 1] = true; belt[i + 1]--; robot[i] = false;
                    if(belt[i + 1] == 0) zeroCnt++;
                }
            }

            if(!robot[0] && belt[0] > 0) {
                robot[0] = true; belt[0]--;
                if(belt[0] == 0) zeroCnt++;
            }
            if(robot[N - 1]) robot[N - 1] = false;


            if(zeroCnt >= K) return time;
        }
    }    

    public static void input() 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());
        belt = new int[N * 2];

        st = new StringTokenizer(br.readLine(), " ");
        for(int i = 0; i < N*2; i++) belt[i] = Integer.parseInt(st.nextToken());
    }
}

 

상반기에 비하면 너무너무 쉽게 나왔습니다.. 아마 2솔컷이 되지 않을까..

 

순열이나 조합으로 완전 탐색하는 것도 아니고.. 그냥 반복돌다가 끝날 조건에 부합하면 나오면 끝입니다.

크게 다음과 같은 두가지 행동을 반복하면 됩니다.

  1. 컨베이어 벨트 한 칸씩 이동 (+ 그 위에 있는 로봇도 옮겨야 합니다)
  2. 앞으로 갈 수 있는 로봇들 이동

로봇이 벨트 위에 있는지 여부를 boolean 배열로 관리했습니다. 지금 생각해보니 N만큼만 있어도 되겠네요 ^^;;

 

문제에서 하라는 대로 고대로 if문 덕지덕지 하면 끝입니다.. 

 

 

심심할 때 두번째 문제도 풀어봐야지 희희

면접 가고 싶다!! 감사합니다~!~