[백준 20055]컨베이어 벨트 위의 로봇

Junghyun(Alec) Park·2021년 9월 26일
0

BAEKJOON

목록 보기
8/13

A. 접근법

'시뮬레이션' 문제로 문제의 조건을 따라 차근차근 구현하면됩니다.

B. 구현

  1. 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
//벨트의 상태를 한 칸 회전
int save = belt[2 * N - 1];
belt.pop_back();
belt.insert(belt.begin(), save);

//로봇의 상태를 한 칸 회전
for(auto it = robot.begin(); it != robot.end(); it++) {
    int move = (*it) + 1;
    if(move == 2 * N)
        move = 0;
    *it = move;
}

언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다.

vector<int>::iterator itr;
    itr = find(robot.begin(), robot.end(), N - 1);
    if(itr != robot.end()) {
        robot.erase(itr);
    }
  1. 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.
    1. 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
for(auto it = robot.begin(); it != robot.end(); it++) {

        int next = (*it) + 1;

        if(next == 2 * N)
            next = 0;

        int chk;
        if(it == robot.begin()) {
            chk = robot[robot.size() - 1];
        }
        else {
            chk = *(it - 1);
        }

        if((chk != next) && (belt[next] >= 1)) {
            (*it)++;
            if(*it == 2 * N)
                *it = 0;
            belt[next]--;
        }
    }
  1. 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
 if(belt[0] != 0) {
        vector<int>::iterator itr;
        itr = find(robot.begin(), robot.end(), 0);
        if(itr == robot.end()) {
            belt[0]--;
            robot.push_back(0);
        }
    }
  1. 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.
for(auto it = belt.begin(); it != belt.end(); it++) {
        if(*it == 0)
            cnt++;

        if(cnt >= K)
            return stage;
    }

C. 코드

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int T, N, K;

vector<int> belt;
vector<int> robot;

int solver(int stage) {
    //1

    int save = belt[2 * N - 1];
    belt.pop_back();
    belt.insert(belt.begin(), save);

    for(auto it = robot.begin(); it != robot.end(); it++) {
        int move = (*it) + 1;
        if(move == 2 * N)
            move = 0;
        *it = move;
    }

    //Delete!!
    vector<int>::iterator itr;
    itr = find(robot.begin(), robot.end(), N - 1);
    if(itr != robot.end()) {
        robot.erase(itr);
    }

    for(auto it = robot.begin(); it != robot.end(); it++) {

        int next = (*it) + 1;

        if(next == 2 * N)
            next = 0;

        int chk;
        if(it == robot.begin()) {
            chk = robot[robot.size() - 1];
        }
        else {
            chk = *(it - 1);
        }

        if((chk != next) && (belt[next] >= 1)) {
            (*it)++;
            if(*it == 2 * N)
                *it = 0;
            belt[next]--;
        }
    }

    //Delete
    vector<int>::iterator itr2;
    itr2 = find(robot.begin(), robot.end(), N - 1);
    if(itr2 != robot.end()) {
        robot.erase(itr2);
    }

    if(belt[0] != 0) {
        vector<int>::iterator itr;
        itr = find(robot.begin(), robot.end(), 0);
        if(itr == robot.end()) {
            belt[0]--;
            robot.push_back(0);
        }
    }

    int cnt = 0;

    for(auto it = belt.begin(); it != belt.end(); it++) {
        if(*it == 0)
            cnt++;

        if(cnt >= K)
            return stage;
    }

    return solver(stage + 1);

}
int main() {
    //scanf("%d", &T);

    T = 1;
    for(int tc = 0; tc < T; tc++) {
        scanf("%d %d", &N, &K);

        int tmp;
        belt.resize(2 * N, 0);
        robot.clear();
        for(int i = 0; i < 2 * N; i++) {
            scanf("%d", &tmp);
            belt[i] = tmp;
        }
        printf("%d\n", solver(1));
    }
    return 0;
}

D. 결과

profile
박정현입니다

0개의 댓글