백준 20055번 컨베이어 벨트 위의 로봇
백준 20055번 컨베이어 벨트 위의 로봇 풀이
문제 설명
구현 문제라서 설명이 길었기 때문에 긁어왔다. 😏
문제를 보고 든 생각
- 구현 문제기 때문에 차근차근 풀어나가자
- 덱(deque)을 사용하면 편하겠다.
- 단계별로 함수를 만들어보자
- 주석도 달아보자
간단한 풀이 설명
- 벨트를 덱으로 구현했다.
- 단계별로 함수를 만들어서 차근차근 했다.
- 문제 설명과 코드만 길고 쉬웠다.
코드
#include <iostream>
#include <deque>
using namespace std;
int N, K;
struct strt{
bool robot;
int cnt;
};
deque<strt> dq;
void getInput(){
cin >> N >> K;
for(int i=0; i<2*N; ++i){
int temp; cin >> temp;
dq.push_back({false, temp});
}
}
void moveBelt(){
strt back = dq.back(); dq.pop_back();
dq.push_front(back);
}
void moveRobot(int n){
if(!dq[n].robot) return;
if(n == N-1){
dq[n].robot = false;
return;
}
if(dq[n+1].robot){
return;
}
if(dq[n+1].cnt >= 1 && dq[n].robot){
if(n+1 == N-1) {
dq[n].robot = false;
dq[n+1].robot = false;
dq[n+1].cnt -= 1;
return;
}
dq[n].robot = false;
dq[n+1].robot = true;
dq[n+1].cnt -= 1;
return;
}
}
void putRobot(){
if(dq[0].cnt >= 1){
dq[0].robot = true;
dq[0].cnt -= 1;
}
}
int checkCnt(){
int cnt = 0;
for(int i=0; i<2*N; ++i){
if(dq[i].cnt <= 0){
++cnt;
}
}
return cnt;
}
int solution(){
getInput();
int cnt = checkCnt();
int ret = 0;
while(cnt < K){
++ret;
moveBelt(); // step 1
if(dq[N-1].robot){ // robot go down
dq[N-1].robot = false;
}
for(int i=N-2; i>=0; --i){ // step 2
moveRobot(i);
}
putRobot(); // step 3
cnt = checkCnt();
}
return ret;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout << solution();
return 0;
}
Author And Source
이 문제에 관하여(백준 20055번 컨베이어 벨트 위의 로봇), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@kkoma2623/백준-20055번-컨베이어-벨트-위의-로봇
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
구현 문제라서 설명이 길었기 때문에 긁어왔다. 😏
- 구현 문제기 때문에 차근차근 풀어나가자
- 덱(deque)을 사용하면 편하겠다.
- 단계별로 함수를 만들어보자
- 주석도 달아보자
간단한 풀이 설명
- 벨트를 덱으로 구현했다.
- 단계별로 함수를 만들어서 차근차근 했다.
- 문제 설명과 코드만 길고 쉬웠다.
코드
#include <iostream>
#include <deque>
using namespace std;
int N, K;
struct strt{
bool robot;
int cnt;
};
deque<strt> dq;
void getInput(){
cin >> N >> K;
for(int i=0; i<2*N; ++i){
int temp; cin >> temp;
dq.push_back({false, temp});
}
}
void moveBelt(){
strt back = dq.back(); dq.pop_back();
dq.push_front(back);
}
void moveRobot(int n){
if(!dq[n].robot) return;
if(n == N-1){
dq[n].robot = false;
return;
}
if(dq[n+1].robot){
return;
}
if(dq[n+1].cnt >= 1 && dq[n].robot){
if(n+1 == N-1) {
dq[n].robot = false;
dq[n+1].robot = false;
dq[n+1].cnt -= 1;
return;
}
dq[n].robot = false;
dq[n+1].robot = true;
dq[n+1].cnt -= 1;
return;
}
}
void putRobot(){
if(dq[0].cnt >= 1){
dq[0].robot = true;
dq[0].cnt -= 1;
}
}
int checkCnt(){
int cnt = 0;
for(int i=0; i<2*N; ++i){
if(dq[i].cnt <= 0){
++cnt;
}
}
return cnt;
}
int solution(){
getInput();
int cnt = checkCnt();
int ret = 0;
while(cnt < K){
++ret;
moveBelt(); // step 1
if(dq[N-1].robot){ // robot go down
dq[N-1].robot = false;
}
for(int i=N-2; i>=0; --i){ // step 2
moveRobot(i);
}
putRobot(); // step 3
cnt = checkCnt();
}
return ret;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout << solution();
return 0;
}
Author And Source
이 문제에 관하여(백준 20055번 컨베이어 벨트 위의 로봇), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@kkoma2623/백준-20055번-컨베이어-벨트-위의-로봇
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
- 벨트를 덱으로 구현했다.
- 단계별로 함수를 만들어서 차근차근 했다.
- 문제 설명과 코드만 길고 쉬웠다.
#include <iostream>
#include <deque>
using namespace std;
int N, K;
struct strt{
bool robot;
int cnt;
};
deque<strt> dq;
void getInput(){
cin >> N >> K;
for(int i=0; i<2*N; ++i){
int temp; cin >> temp;
dq.push_back({false, temp});
}
}
void moveBelt(){
strt back = dq.back(); dq.pop_back();
dq.push_front(back);
}
void moveRobot(int n){
if(!dq[n].robot) return;
if(n == N-1){
dq[n].robot = false;
return;
}
if(dq[n+1].robot){
return;
}
if(dq[n+1].cnt >= 1 && dq[n].robot){
if(n+1 == N-1) {
dq[n].robot = false;
dq[n+1].robot = false;
dq[n+1].cnt -= 1;
return;
}
dq[n].robot = false;
dq[n+1].robot = true;
dq[n+1].cnt -= 1;
return;
}
}
void putRobot(){
if(dq[0].cnt >= 1){
dq[0].robot = true;
dq[0].cnt -= 1;
}
}
int checkCnt(){
int cnt = 0;
for(int i=0; i<2*N; ++i){
if(dq[i].cnt <= 0){
++cnt;
}
}
return cnt;
}
int solution(){
getInput();
int cnt = checkCnt();
int ret = 0;
while(cnt < K){
++ret;
moveBelt(); // step 1
if(dq[N-1].robot){ // robot go down
dq[N-1].robot = false;
}
for(int i=N-2; i>=0; --i){ // step 2
moveRobot(i);
}
putRobot(); // step 3
cnt = checkCnt();
}
return ret;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout << solution();
return 0;
}
Author And Source
이 문제에 관하여(백준 20055번 컨베이어 벨트 위의 로봇), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kkoma2623/백준-20055번-컨베이어-벨트-위의-로봇저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)