[문제보기]

 진용이네 주차타워

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

[풀이방법]

  (1) 주차장의 단위 무게당 요금을 저장하는 r_i배열, 주차장에 어느 차량이 들어갔는지 저장해주는 check_r배열

      차량의 무게를 저장해주는 w_i배열, 주자장이 다 꽉 찼을 때 차량이 대기하는 queue q를 선언해준다.

  (2) 변수 x에 차량의 출입 순서에 대한 데이터를 입력 받는다.

       x가 0보다 클 경우( = 차량이 들어온 경우)

         주자장의 자리가 있는 경우(check_r검사)

           check_r을 검사해서 자리가 있으면 그 곳에 차량을 넣어주고, 그 차량의 무게와 넣어진 주차장의

           단위 무게당 요금을 곱한 값을 ans에 더해준다.

         주차장의 자리가 없는 경우

            차량의 대기를 위해 만들어 놓은 q에 차량의 정보를 넣어준다.

        x가 0보다 작을 경우( = 차량이 빠지는 경우) 

          x와 check_r을 빼서 0이 되는 곳이 빠지는 차량이 있는 곳이 된다. 그곳을 찾아서 check_r을 다시 0으로 

          만들어주고( = 차량이 빠졌다) 

          q에 데이터가 있는 경우( = 대기하고 있는 차량이 있는 경우) 

           q의 front값을 위의 차량이 빠진 자리에 넣어주고, 그 차량에 대한 무게와 주차장의 단위 무게당 요금을

          곱해서 ans에 더해준다. 그리고 q.pop()을 통해 대기 차량의 정보를 빼준다.

 

[소스코드]

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int n, m;
int r_i[101];
int check_r[101];
int w_i[10001];
int ans;


int main(){
    cin.tie(0);
    cout.sync_with_stdio(false);
    int T;
    cin >> T;
    for(int test = 1; test <= T; test++){
        ans = 0;
        queue<int> q;
        memset(r_i, 0, sizeof(r_i));
        memset(w_i, 0, sizeof(w_i));
        memset(check_r, 0, sizeof(check_r));
        
        cin >> n >> m;

        for(int i=1; i<=n; i++){
            cin >> r_i[i];
        }
        for(int i=1; i<=m; i++){
            cin >> w_i[i];
        }

        int x;
        int price;
        bool full;
        for(int i=0; i<2*m; i++){
            cin >> x;
            if(x >0){
                for(int j=1; j<=n; j++){
                    if(check_r[j] == 0){
                        full = false;
                        check_r[j] = x;
                        price = r_i[j];
                        break;
                    }
                    full = true;
                }

                if(!full){
                    ans += price * w_i[x];
                }
                else{
                    q.push(x);
                }
            }
            else{
                for(int j=1; j<=n; j++){
                    int temp = check_r[j] + x;
                    if(temp == 0){
                        check_r[j] = 0;
                        if(q.size() != 0){
                            check_r[j] = q.front();
                            price = r_i[j];
                            ans += price * w_i[q.front()];
                            q.pop();
                        }
                        break;
                    }
                }

            }
        }

        cout << "#" << test << " " << ans << "\n";


    }
}

 

[해결 과정 중 실수한 부분]