ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SWEA] 진용이네 주차타워
    Algorithm/SWEA 2020. 4. 5. 14:15

    [9280] 진용이네 주차타워

    https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AW9j74FacD0DFAUY

    • 진용이가 운영하는 유료 주차장의 총 수입을 계산하는 프로그램
    • 진용이는 오늘 주차장을 이용할 m대의 차량들이 들어오고 나가는 순서를 알고 있다.
    • <주차창 운영 방식>
    • 차가 주차장에 도착하면 진용이는 주차 공간이 있는지 검사한다.
    • 비어있는 공간이 있으면 진용이는 곧바로 주차를 시키며, 주차 가능한 공간 중 번호가 가장 작은 주차 공간에 주차하도록 한다.
    • 빈 주차 공간이 있으면 진용이는 곧바로 주차를 시키며, 주차 가능한 공간 중 번호가 가장 작은 주차 공간에 주차하도록 한다.
    • 만약 주차를 기다리는 차량이 여러 대라면, 입구의 대기장소에서 자기 차례를 기다려야 한다.

     

     

    Solution

    • in, 비어있는 주차 공간이 있으면 parking
    • in, 비어있는 주차 공간이 없으면 add waitList
    • out, leave()
    • out, waitList에 기다리는 차가 있으면 parking

     

     

    소스코드

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    import java.util.LinkedList;
    import java.util.Scanner;
     
    public class Solution {
        static int tc, n, m, result;
        static Room[] rooms;
        static Car[] cars;
        static LinkedList<Integer> inAndOut;
        static LinkedList<Car> waitList;
     
        static class Car{
            private int room;
            private int num;
            private int weight;
            public Car(int num, int weight){
                this.room = 0;
                this.num = num;
                this.weight = weight;
            }
        }
        
        static class Room {
            private int num;
            private int price;
            private boolean inUse;
            
            public Room(int num, int price) {
                this.num = num;
                this.price = price;
                this.inUse = false;
            }
        }
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int tn = sc.nextInt();
            for (int tc = 1; tc <= tn; tc++) {
                n = sc.nextInt();
                m = sc.nextInt();
                init();
                for (int i = 1; i <= n; i++) {
                    rooms[i] = new Room(i, sc.nextInt());
                }
                for (int i = 1; i <= m; i++) {
                    cars[i] = new Car(i, sc.nextInt());
                }
                for (int i = 1; i <= 2 * m; i++) {
                    inAndOut.add(sc.nextInt());
                }
     
                result = 0;
                int index = 0;
                while (index < 2 * m) {
                    int car = inAndOut.get(index++);
                    // in -> 주차공간 확인
                    if (car > 0) {
                        int roomNum = getRoomNumber();
                        if (roomNum < 0) { // 주차공간이 없으면
                            waitList.add(cars[car]);
                            continue;                        
                        }
                        parking(roomNum, cars[car]);
                    }
                    // out
                    else {
                        car = Math.abs(car);
                        leave(car);
                        if(!waitList.isEmpty()) {
                            int roomNum = getRoomNumber();
                            parking(roomNum, waitList.removeFirst());
                        }
                    }
                }
     
                System.out.println("#" + tc + " " + result);
            }
        }
     
        static void leave(int car) {
            rooms[cars[car].room].inUse = false;
        }
        static void parking(int roomNum, Car car) {
            rooms[roomNum].inUse = true;
            car.room = roomNum;
            result += (rooms[roomNum].price * car.weight);
        }
        
        static int getRoomNumber() {
            for (int i = 1; i <= n; i++) {
                if (!rooms[i].inUse)
                    return i;
            }
            return -1;
        }
     
        static void init() {
            rooms = new Room[n+1];
            cars = new Car[m + 1];
            waitList = new LinkedList<>();
            inAndOut = new LinkedList<>();
        }
    }
    cs

    'Algorithm > SWEA' 카테고리의 다른 글

    [SWEA] 초콜릿과 건포도  (0) 2020.04.15
    [SWEA] 시험  (0) 2020.04.05
    [SWEA] 탈주범 검거  (0) 2020.03.03
    [SWEA] 특이한 자석  (0) 2020.02.21
    [SWEA] 올해의 조련사  (0) 2020.02.18

    댓글

Designed by Tistory.