728x90
반응형
1. 문제
https://www.acmicpc.net/problem/20055
2. 풀이
시뮬레이션 문제이다.
문제의 주어진 조건을 꼼꼼히 보고 수행하면된다.
시뮬레이션 풀 때 함수를 작게 쪼개면 편한 것 같다.
일단, 나는 마지막 테스트케이스에서 계속 틀렸었는데..
가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다.
이 조건을 제대로 안봤다..
그래서 해당 로직을 수행하는 for문을 역순으로 바꾸니 맞았다..
3. 코드
#include <iostream>
#include <vector>
using namespace std;
class Node {
public:
int hp;
bool existRobot;
Node(int hp) {
this->hp = hp;
this->existRobot = false;
}
};
int N, K, ans;
vector<Node> belt;
bool isExit() {
int count = 0;
for(int i=0; i<2*N; i++) {
if(belt[i].hp == 0) count++;
}
if(count >= K) return true;
return false;
}
void spinBelt() {
Node lastNode = belt[2*N-1];
for(int i=2*N-1; i>=1; i--) {
belt[i] = belt[i-1];
}
belt[0] = lastNode;
}
void popRobot() {
if(belt[N-1].existRobot) belt[N-1].existRobot = false;
}
void executeStep() {
// 벨트를 한칸씩 회전시킨다.
spinBelt();
// 내릴 수 있으면 내리셈
popRobot();
// 가장먼저 벨트에 올라간 로봇부터, 이동할 수 있으면 이동하센.
// 해당 칸에 로봇이 없으며, 해당 칸의 내구도가 1이상이어야 함.
// 역순으로 탐색해야함.. 왜냐면 가장 먼저 올라간 로봇 먼저 이동시켜야하니까..
for(int i=N-2; i>=0; i--) {
if(belt[i].existRobot) { // 이 칸에 존재하면
// 다음 칸을 보고 되면 이동시킴
if(!belt[i+1].existRobot && belt[i+1].hp >= 1) {
belt[i+1].existRobot = true;
belt[i+1].hp--;
belt[i].existRobot = false;
}
}
}
// 내릴 수 있으면 내리셈
popRobot();
// 올릴 수 있으면 로봇을 첫번째 칸에 올림
if(belt[0].hp >= 1) {
belt[0].existRobot = true;
belt[0].hp--;
}
// 종료 체크는 메인에서 따로함~~
}
// 20055
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
cin >> N >> K;
for(int i=0; i<2*N; i++) {
int h;
cin >> h;
belt.push_back(Node(h));
}
while(true) {
executeStep();
ans++;
if(isExit()) break;
}
cout << ans;
return 0;
}
728x90
반응형
'💡 Problem Solving > Baekjoon' 카테고리의 다른 글
[백준 - 1946] 신입 사원 [C++] (0) | 2023.10.22 |
---|---|
[백준 - 4358] 생태학 [C++] (0) | 2023.10.22 |
[백준 - 1197] 최소 스패닝 트리 [C++] (0) | 2023.10.20 |
[백준 - 7490] 0 만들기 [C++] (0) | 2023.10.19 |
[백준 - 1629] 곱셈 [C++] (0) | 2023.10.19 |