[ baekjoon ] #5464 주차장

eunheelog·2023년 6월 26일
0

baekjoon

목록 보기
13/20

백준 #5464 주차장

문제 요약


  • 1부터 N까지 번호가 매겨진 주차공간 존재
  • 매일 아침 모든 주차공간이 비어있음
    ① 차가 주차장에 도착하면 비어있는 주차공간이 있는지 검사
    ② 비어있는 공간이 없으면 빈 공간이 생길 때까지 대기
    ③ 빈 주차 공간이 하나만 있거나 공간이 없다가 생기면 바로 주차
  • 먼저 대기한 차량부터 주차
  • 주차료는 차량의 무게에 비례하는 방식으로 책정
    → 주차료 = 차량의 무게 X 주차 공간의 단위 무게당 요금
  • 관리원은 이용할 차량의 개수(M)와 순서를 알고 있다.
  • 하룻동안 주차장 총 수입 구하기 !

💡Idea

  1. 주차 공간을 어떻게 관리할까?
    • idx를 두고 증가시키면서 주차 공간의 크기와 같아지면 0으로 초기화 시키자
      → 현재 idx보다 앞의 공간이 사라질 경우 문제 발생
    • idx 대신 map을 사용하자 !
      → map으로 각 주차공간이 비어있는지 아닌지 판단하여 해결

[ SourceCode ]

#include <iostream>
#include <vector>
#include <queue>
#include <map>
using namespace std;

int main() {
    // 1. 입력 받기
    int N, M, total = 0;
    cin >> N >> M;
    // 주차 공간들의 단위 무게당 요금
    vector<int> fee(N);
    map <int, int> place;
    for(int i=0; i<N; i++) {
        cin >> fee[i];
        place[i] = 0;
    }
    // 차량의 무게
    vector<int> car(M+1);
    for(int i=1; i<=M; i++) {
        cin >> car[i];
    }
    // 2. 순서대로 주차하고 요금 계산하기
    queue <pair<int, int>> parking;
    queue <int> waiting;
    for(int i=0; i<2*M; i++) {
        int num;
        cin >> num;
        // 들어오는 경우(양의 정수)
        if(num > 0) {
            waiting.push(num);
            for (auto p : place) {
                if(p.second == 0) {
                    parking.push({waiting.front(), p.first});
                    place[p.first]++;
                    waiting.pop();
                    break;
                }
            }
        }
        // 나가는 경우(음의 정수)
        else {
            int n = parking.size();
            while(n--) {
                int car_num = parking.front().first;
                int x = parking.front().second;
                if((num * -1) == car_num) {
                    total += car[car_num] * fee[x];
                    place[x] = 0;
                }
                else {
                    parking.push(parking.front());
                }
                parking.pop();
            }
            if(waiting.empty()) continue;
            for (auto p : place) {
                if(p.second == 0) {
                    parking.push({waiting.front(), p.first});
                    place[p.first]++;
                    break;
                }
            }
            waiting.pop();
        }
    }
   
    cout << total;

    return 0;
}

Feedback


  1. 코드를 다 짜고 나서 분리할 수 있는 경우 함수로 분리하는 연습을 하자 !
profile
⛧1일 1알고리즘⛧

0개의 댓글