이 문제는 이번에 삼성 sw역량평가 오전 1번 문제였다. 이번에 나도 코딩테스트를 봤는데 이문제를 풀었었다.

현장에서 test case를 모두 통과했지만, 다시한번 풀어보고 확인해보았다.

결과는 성-공!

구현 자체는 별로 어렵지않았다. 순서대로 한바퀴 돌려주고 사람 이동시키고 내리고 올리고 하면되기때문에 간단했다.

#include <iostream>

using namespace std;

struct block{
    bool human;
    int dur;
};

block belt[202];

void init(int n){
    for(int i=0;i<2*n;i++){
        belt[i].human=false;
        belt[i].dur=0;
    }
}

int main(void){
    int N,K;
    cin>>N>>K;
    init(N);
    for(int i=0;i<2*N;i++){
        cin>>belt[i].dur;
    }
    int time=0;
    while(1){
        time++;
        //한바귀 회전
        block c_belt[202];
        for(int i=0;i<2*N-1;i++){
            c_belt[i+1]=belt[i];
        }
        c_belt[0]=belt[2*N-1];

        for(int i=0;i<2*N;i++){
            belt[i]=c_belt[i];
        }

        if(belt[N-1].human == true) belt[N-1].human=false;

        for(int i=N-2;i>=0;i--){
            if(belt[i+1].human == false and belt[i].human==true and belt[i+1].dur >0){
                belt[i].human=false;
                belt[i+1].human=true;
                belt[i+1].dur--;
            }
        }

        if(belt[N-1].human==true) belt[N-1].human=false;

        if(belt[0].human == false and belt[0].dur>0){
            belt[0].human=true;
            belt[0].dur--;
        }
        int cnt=0;
        for(int i=0;i<2*N;i++){
            if(belt[i].dur==0)cnt++;
        }
        if(cnt>=K)break;

    }
    cout<<time<<endl;

}

+ Recent posts