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

안유태·2023년 7월 5일
0

알고리즘

목록 보기
104/239

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

문제가 까다로웠던 구현 문제이다. 문제 자체 구현에는 어렵지 않았다. 4가지 순서를 메소드로 나누어 구현해준 후 이를 반복문을 돌며 몇단계인지 카운트해주었다. 문제는 역시나 이번에도 !! 문제 이해였다. 나는 처음에 올리는 위치만을 생각해 내리는 위치를 고려하지 않았다. 그래서 내리는 위치 에서 로봇을 제거해주어야 하는데 이를 해주지 않아 계속 잘못된 답을 내놓았고 시간을 많이 낭비하였다.... 시간 단축에는 역시나 이해가 가장 중요하다.



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

using namespace std;

int N, K;
vector<int> A;
vector<int> robot;

void step1() {
    int a = A.back();
    A.pop_back();
    A.insert(A.begin(), a);

    for (int i = 0; i < robot.size(); i++) {
        robot[i]++;
        if (robot[i] == N - 1) {
            robot.erase(robot.begin() + i);
            i--;
        }
    }
}

void step2() {
    for (int i = 0; i < robot.size(); i++) {
        if (A[robot[i] + 1] > 0 && !count(robot.begin(), robot.end(), robot[i] + 1)) {
            robot[i]++;
            A[robot[i]]--;

            if (robot[i] == N - 1) {
                robot.erase(robot.begin() + i);
                i--;
            }
        }
    }
}

void step3() {
    if (A[0] > 0) {
        robot.push_back(0);
        A[0]--;
    }
}

bool step4() {
    int zero = 0;
    for (int i = 0; i < A.size(); i++) {
        if (A[i] == 0) zero++;
    }

    return zero >= K ? true : false;
}

void solution() {
    int answer = 0;

    while (1) {
        answer++;

        step1();
        step2();
        step3();
        if (step4()) break;
    }

    cout << answer;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    cin >> N >> K;
    int a;
    for (int i = 0; i < N * 2; i++) {
        cin >> a;
        A.push_back(a);
    }

    solution();

    return 0;
}
profile
공부하는 개발자

0개의 댓글