실버1등급 문제였다. 구현문제로 원하는 대로 구현해내면 성공하는 문제.
주의할 점은 로봇이 처음들어온 순서대로 처리되어야 하므로 queue를 사용해야 한다.
queue도 오랜만에 써봐서 중간값 변경 안되는거 헤맸다...
visit배열도 만들어줘서 현재 그 벨트에 로봇이 있는지 없는지 체크해줬다.
20055번: 컨베이어 벨트 위의 로봇
길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부
www.acmicpc.net
중간에 index 잘못설정해줘서 틀렸다... 역시 index 너무 헷갈린다.

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int n, k;
int container[210], visit[210];
queue<int> robot;
int start_, end_, count_;
void Input() {
cin >> n >> k;
for (int i = 0; i < 2 * n; i++) {
cin >> container[i];
}
start_ = 0;
end_ = n-1;
count_ = 0;
}
void FirstStep() {
start_--; end_--;
if (start_ < 0) start_ = n * 2 - 1;
if (end_ < 0) end_ = n * 2 - 1;
}
void SecondStep() {
int size = robot.size();
for (int i = 0; i < size; i++) {
int cur = robot.front();
visit[cur] = false;
robot.pop();
if (cur == end_) continue;
int next = cur + 1;
if (next >= 2 * n) next = 0;
if (container[next] > 0 && visit[next] == 0) {
container[next]--;
if (next == end_) continue;
visit[next] = 1;
robot.push(next);
}
else {
visit[cur] = 1;
robot.push(cur);
}
}
}
void ThirdStep() {
if (visit[start_] == 0 && container[start_] > 0) {
visit[start_] = 1;
container[start_]--;
robot.push(start_);
}
}
bool checkK() {
int countK = 0;
for (int i = 0; i < 2 * n; i++) {
if (container[i] == 0) countK++;
if (countK >= k) {
return true;
}
}
return false;
}
int main() {
Input();
bool endStep = false;
while (1) {
count_++;
FirstStep();
SecondStep();
ThirdStep();
endStep = checkK();
if (endStep) {
cout << count_;
break;
}
}
return 0;
}'코딩테스트' 카테고리의 다른 글
| 백준 1110 더하기 사이클 (0) | 2021.04.19 |
|---|---|
| 백준 2993 세부분 (0) | 2021.04.15 |
| 백준 16639 평범한 배낭 (0) | 2021.04.13 |
| 백준 17780 새로운 게임 (0) | 2021.04.13 |
| 백준 17825 주사위 윷놀이 (0) | 2021.04.08 |
댓글