[문제보기]
[풀이방법]
(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";
}
}
[해결 과정 중 실수한 부분]
'알고리즘 스터디 > SW_Expert_Academy' 카테고리의 다른 글
[SWEA 9480][C++] 민정이와 광직이의 알파벳 공부(D3) (0) | 2020.07.16 |
---|---|
[SWEA 9317][C++] 석찬이의 받아쓰기(D3) (0) | 2020.07.16 |
[SWEA 9229][C++] 한빈이와 Spot Mart(D3) (0) | 2020.07.14 |
[SWEA 2814][C++] 최장 경로(D3) (0) | 2020.07.12 |
[SWEA 1215][C++] [S/W 문제해결 기본] 3일차 - 회문1 (D3) (0) | 2020.07.11 |