ALGORITHM

[JAVA] 백준 5464번- 주차장

연듀 2022. 7. 22. 10:51

https://www.acmicpc.net/problem/5464

 

5464번: 주차장

시내 주차장은 1부터 N까지 번호가 매겨진 N개의 주차 공간을 가지고 있다. 이 주차장은 매일 아침 모든 주차 공간이 비어 있는 상태에서 영업을 시작하며, 하룻동안 다음과 같은 방식으로 운영

www.acmicpc.net

 

-주차장에 빈공간이 여러개 있으면 주차장 번호가 가장 작은 곳으로 감

-주차장에 비어있는 공간 없으면 빈공간 생길때까지 차량 대기

이 때, 도착한대로 줄 서서 대기(큐)

-주차료(주차한 차량의 무게 * 단위 무게당 요금 의 합)를 구하는 문제 

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        int[] currentParking = new int[n + 1]; // 몇번 칸에 몇번차가 주차중인지
        int[] carWeight = new int[m + 1]; // 차량들의 무게
        int[] parkingWeight = new int[n + 1]; // 주차 공간들의 단위 무게당 요금

        int sum = 0;

        for (int i = 1; i <=n; i++) {
            parkingWeight[i] = Integer.parseInt(br.readLine());
        }
        for (int i = 1; i <=m; i++) {
            carWeight[i] = Integer.parseInt(br.readLine());
        }
        Queue<Integer> queue = new LinkedList<>();

       outer: for (int i = 0; i < 2 * m; i++) {
            int car = Integer.parseInt(br.readLine());

            if (car > 0) { // 들어오는 차라면
                for (int j = 1; j < n + 1; j++) { // 번호 순대로
                    if (currentParking[j] == 0) { // 빈자리가 있으면
                        currentParking[j] = car; // 차를 주차
                        continue outer;
                    }
                }
                queue.offer(car); //빈자리가 없으면 큐에 넣음
            } else { // 나가는 차라면
                for (int j = 1; j < n + 1; j++) {
                    if (currentParking[j] == car * (-1)) {
                        currentParking[j] = 0; // 해당 자리를 0으로
                        sum += parkingWeight[j] * carWeight[car * (-1)];
                        if (!queue.isEmpty()) currentParking[j] = queue.poll();
                        // 큐가 비어있지 않다면 차가 빠져나간 자리에 맨 앞에 있는 차를 넣음
                        break;
                    }
                }
            }
        }
        System.out.println(sum);
    }
}

 

 

들어오는 차일 경우

->for문을 돌며 주차장에 빈 자리가 있으면 주차장 공간의 작은 번호 순대로 차를 넣는다.

주차장에 빈자리가 없으면 큐에 넣어 대기시킨다.

 

나가는 차일 경우

-> 나가는 차의 자리를 0으로 바꾸고 sum 에 주차료(주차 공간 단위 무게당 요금 * 차 무게)를 누적시킨다.

큐가 비어있지 않아 대기 하고 있는 차량이 있다면 차가 빠져나간 자리에 큐의 맨앞에 있는 차를 넣는다.