1. 풀이방법
- 그냥 조건대로만 구현해 주시면 됩니다.
- 컨베이어 벨트는 문제그대로 N의 최대값인 200을 채우고 INDEX를 그대로 쓰려고 201로 선언해주었고
- bool 타입의 로봇배열을 그의 절반만 선언해서 벨트의 index와 같이 맞추어 위치를 index로 접근하였습니다.
2. 주의사항
- 굳이 이 문제를 블로그에 남기는 데에는 문제설명자체가 얼핏 잘못이해하기 쉬워서입니다.
- 일단 일반적인 우리의 생각으로는 당연히 컨베이어벨트가 한칸움직이면 위의 물건도 따라 움직입니다.
- 그리고 이문제에서는 그와 별개로 로봇도 움직일 수 있다. 라는 것이 이 문제입니다.
- 결국 일반적인 컨베이어벨트의 이동 + 로봇의 이동이 모두 들어간 문제입니다.
- 처음에는 문제의 조건을 읽고 일반적인 컨베이어벨트의 이동에 대한 설명은 없어서 그것을 제외하고 해야하나??
- 벨트는 벨트대로 움직이고 나서, 로봇의 이동을 하는 것인가 생각하였지만 그것은 아니였습니다.
- 물론 테스트케이스가 여러개라서 그것들을 통해서 위의 의문을 걸러낼 수 있습니다.
3. 나의코드
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int N, K;
int zerocount;
int p = 0;
int barr[201];
bool robo[101];
void ratate() { //barr[0]는 그냥 tmp용으로 사용
barr[0] = barr[2 * N];
for (int i = 2 * N; i >= 2; i--) { //벨트이동
barr[i] = barr[i - 1];
}
for (int i = N - 1; i >= 1; i--) { //로봇이동
robo[i + 1] = robo[i];
}
robo[1] = false;
barr[1] = barr[0];
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> N >> K;
for (int i = 1; i <= 2*N; i++) {
cin >> barr[i];
if (barr[i] == 0) zerocount++;
}
while (1) {
if (zerocount >= K) break;
p++;
ratate();
if (robo[N] == true) { //내려오는 칸
robo[N]= false;
}
for (int i = N - 1; i >= 1; i--) { //이동관련
if (robo[i] == true) {
if (robo[i + 1] == false && barr[i + 1] >= 1) {
robo[i] = false; robo[i + 1] = true;
barr[i + 1]--;
if (barr[i + 1] == 0) zerocount++;
}
}
}
if (robo[1] == false && barr[1] >= 1) { //올라가는 칸
robo[1] = true; barr[1]--;
if (barr[1] == 0) zerocount++;
}
}
cout << p << "\n";
return 0;
}
'알고리즘 문제풀이 > 구현' 카테고리의 다른 글
백준 20061 [C++] (0) | 2020.12.28 |
---|---|
백준 20056 [C++] (0) | 2020.12.23 |
백준 13458 [C++] (0) | 2020.12.15 |
백준 15685 [C++] (0) | 2020.12.08 |
백준 17144 [C++] (0) | 2020.12.08 |