백준 5464 java : 구현, 자료구조, class

magicdrill·2025년 6월 23일
0

백준 문제풀이

목록 보기
623/655

백준 5464 java : 구현, 자료구조, class

어려운 알고리즘은 아닌데, 자료구조와 class를 적극 사용해서 객체지향 프로그래밍을 연습하느라 오래 걸렸다.
class 배열을 사용했는데, 정수 index로 접근하다 보니, 인덱스 - 1을 하는 것 처럼 추가 연산이 필요해서 실수가 발생할 수 있다. class배열 말고 map 배열로 접근하는 것이 실수를 줄일 수 있을 거 같다.

import java.util.*;

public class BJ5464 {
    static class ParkingLot{
        int parkingSpaceNum;
        int currentCarNum;
        int fee;

        ParkingLot (int parkingSpaceNum, int currentCarNum, int fee){
            this.parkingSpaceNum = parkingSpaceNum;
            this.currentCarNum = currentCarNum;
            this.fee = fee;
        }
    }

    static class Car{
        int carNum;
        int weight;

        Car(int carNum, int weight){
            this.carNum = carNum;
            this.weight = weight;
        }
    }

    static Scanner sc = new Scanner(System.in);
    static int N, M;
    static ParkingLot [] parkingLots;
    static Car [] cars;
    static int [] inOut;

    public static void main(String[] args) {
        inputData();
        System.out.println(findAnswer());

        sc.close();
    }

    public static void inputData(){
        int i, s, W;

        N = sc.nextInt();
        M = sc.nextInt();

        parkingLots = new ParkingLot[N];
        for(i = 0; i < parkingLots.length; i++){//주차 공간들의 단위 무게당 요금
            s = sc.nextInt();
            parkingLots[i] = new ParkingLot(i + 1, 0, s);
        }

        cars = new Car[M];
        for(i = 0; i < cars.length; i++){
            W = sc.nextInt();
            cars[i] = new Car(i+1, W);
        }

        inOut = new int[2*M];
        for(i = 0; i < inOut.length; i++){
            inOut[i] = sc.nextInt();
        }
    }

    public static int findAnswer(){
        int costSum = 0, i, j, currentCar;
        Queue<Integer> waitingQueue = new LinkedList<>();

        for(i = 0; i < inOut.length; i++){
            currentCar = inOut[i];

            if(currentCar > 0){//차가 들어와야 하는 경우
                System.out.println(currentCar + "번 차 들어옴");
                for(j = 0; j < parkingLots.length; j++){
                    if(parkingLots[j].currentCarNum == 0){// 빈 공간 찾음
                        parkingLots[j].currentCarNum = currentCar;//해당 공간에 삽입
                        System.out.println(parkingLots[j].parkingSpaceNum + "에 " + parkingLots[j].currentCarNum + "번 차 삽입");
                        costSum += (parkingLots[j].fee * cars[currentCar - 1].weight);
                        break;
                    }
                }
                if(j == parkingLots.length){// 빈 공간 못 찾음
                    System.out.println("빈 공간 없음, 대기열에 삽입");
                    waitingQueue.offer(currentCar);//대기열에 삽입
                }
            }
            else{//차가 나가야 하는 경우
                System.out.println(currentCar + "번 차 나감");
                for(j = 0; j < parkingLots.length; j++){
                    if(parkingLots[j].currentCarNum == -currentCar){
                        parkingLots[j].currentCarNum = 0;//해당 주차장에서 나가기
                        break;
                    }
                }
                if(!waitingQueue.isEmpty()){
                    parkingLots[j].currentCarNum = waitingQueue.poll();
                    System.out.println(parkingLots[j].parkingSpaceNum + "에 대기열에서" + parkingLots[j].currentCarNum + "번 차 삽입");
                    costSum += (parkingLots[j].fee * cars[parkingLots[j].currentCarNum - 1].weight);
                }
            }
        }

        return costSum;
    }
}

0개의 댓글