Coding Is My Life

코딩은 인생

삼성sw역량테스트 기출문제

컨베이어 벨트 위의 로봇(백준 20055번)

산기대 컴공 2021. 5. 23. 22:08
728x90

문제

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

 

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

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

www.acmicpc.net

문제 설명

문제 설명이 약간 해석하기 어려운데 간단하게 그냥 저 컨베이어 벨트가 현실과 똑같이 움직인다고 생각한다면 쉽다.

로봇은 무조건 올리는 자리에 올라가야하고 내리는 자리에서 내려야한다. 그리고 로봇은 움직일 수 있으면 무조건

움직이여야한다. 로봇이 움직이거나 로봇을 올리면 컨베이어 벨트에 내구도가 -1 된다. 이 내용만 숙지하고 조건에

맞게 풀어 나가면 된다.

 

알고리즘 풀이

1. 컨베이어 벨트 배열의 길이를 201, 로봇을 놓는 배열의 길이를 101로 설정한다. (문제와 같이 인덱싱하기 위함)

로봇을 놓는 배열의 길이가 101인 이유는 로봇을 놓는 것은 결국에는 1~N이기 때문이다.

2. 조건에 맞게 설계하면 된다. 딱히 설명이 필요하기 보다는 코드를 보는것이 좋을 것 같다.

 

코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
int N,K;
int result = 0;
int cnt = 0;
int belt[201];
bool robo[101= {false};
void turn(void){
    belt[0= belt[2*N];
    for(int i = 2*N;i>=2;i--){
        belt[i] = belt[i-1];
    }
    for(int i = N;i>=2;i--){
        robo[i] = robo[i-1];
    }
    robo[1= false;
    belt[1= belt[0];
}
int main(int argc, char* argv[]){
    cin >> N >> K;
    for(int i = 1;i<=2*N;i++){
        cin >> belt[i];
        if(belt[i] == 0){cnt++;}
    }
    while(1){
        if(cnt>=K){break;}
        result++;
        turn();
        if(robo[N]){
            robo[N] = false;
        }
        for(int i = N-1;i>=1;i--){
            if(robo[i] == true){
                if(belt[i+1>=1&&robo[i+1== false){
                    robo[i+1= true;
                    robo[i] = false;
                    belt[i+1]--;
                    if(belt[i+1== 0){cnt++;}
                }
            }
        }
        if(belt[1>= 1 && robo[1== false){
            robo[1= true;
            belt[1]--;
            if(belt[1== 0){cnt++;}
        }
    }
    cout << result;
}
cs
728x90