반응형
728x170
그냥 시키는 대로 하면 된다.
다만 빼먹으면 안된다.
모든 조건을 빼먹으면 안된다.
https://www.acmicpc.net/problem/20055
#맞는 풀이
#include <iostream>
#include <deque>
#define X first
#define Y second
using namespace std;
using ll = long long;
int N, K; // 칸과 제한
deque <pair<int, int>> deq; // 로봇이 있는지 1,0 내구도 int
int main() {
cin >> N >> K;
int num = 2 * N;
while (num--) {
int x;
cin >> x;
deq.push_back({0,x }); //로봇이 없는 채로 deq 초기화
}
int stage = 0;
while (1) {
stage++;//스테이지 시작
//1번 작업 -> 한 칸 밀기.
auto back = deq.back();
deq.pop_back();
deq.push_front(back);
//밀었을 때 로봇이 내리는 위치에 있으면 당장내림
if (deq[N - 1].first == 1) {
deq[N - 1].first = 0;
}
//2번 작업 -> 가장 앞에 있는 로봇부터 (N-1은 이미 내려감)
for (int i = N - 2; i >= 0; i--) {
//i번째 칸에 로봇이 있고 i+1 칸의 내구도가 1 이상이고 로봇이 없으면
if (deq[i].first == 1 && deq[i + 1].second >= 1 && deq[i + 1].first == 0) {
deq[i].first = 0; //현재 칸에서 로봇이 사라지며
deq[i + 1].first = 1; //다음 칸으로 이동
deq[i + 1].second -= 1; //다음 칸의 내구도 -1
}
}
//로봇이 움직였을 때 로봇이 내리는 위치에 있으면 당장내림
if (deq[N - 1].first == 1) {
deq[N - 1].first = 0;
}
//3번 작업 -> 올리는 칸의 내구도가 0이 아니면 올림
if (deq[0].second != 0) {
deq[0].first = 1;
deq[0].second -= 1; //내구도 1감소
}
//4번 작업 -> 모든 칸에 대한 내구도 0인 개수 조사
int cnt = 0;
for (int i = 0; i < 2 * N; i++) {
if (deq[i].second == 0) { cnt++; }
}
if (cnt >= K) {
break;
}
}
cout << stage;
return 0;
}
왠지 원형 큐 같긴래 deq을 이용했더니 정말 쉬웠다.
점점 감이 오는 건가..?
자만하지 말고 해보자
728x90
반응형
그리드형
'문제풀이(Problem Solving)' 카테고리의 다른 글
백준, BOJ, 14500번, 테트로미노: C++ [CPP] (0) | 2021.12.10 |
---|---|
백준, BOJ, 21608번, 상어초등학교: C++ [CPP] (0) | 2021.12.08 |
백준, BOJ, 3190번, 뱀 : C++ [CPP] (0) | 2021.12.08 |
백준, BOJ, 1707번, 이분 그래프 : C++ [CPP] ★ (0) | 2021.12.07 |
백준, BOJ, 1753번, 최단경로 : C++ [CPP] ★★★★★ (0) | 2021.12.07 |