주차요금계산

hyeongjun Jo·2022년 11월 29일
0

Programmers

목록 보기
5/7
post-custom-banner

https://school.programmers.co.kr/learn/courses/30/lessons/92341

문제

풀이

HashMap과 Queue를 사용해서 풀었다.
문제에서는 IN, OUT을 제공해서 들어왔는지 나갔는지 정보를 제공해주었는데 나는 그걸 안쓰고 바로 Queue에서 두 개씩 짝지어서 들어가고 나간 것을 계산하고 하나 남았을 때 23:59 OUT임으로 계산하였다.

  1. HashMap에 Queue를 이용하여 차량번호마다 입차시간, 출차시간을 저장한다

  2. 저장한 시간을 out - in으로 분으로 바꿔서 계산한다

  3. 시간을 요금으로 계산한다

    queue에 저장한 입차시간, 출차시간을 하나의 정수 시간으로 바꿀 때 List를 사용할 까 했지만 queue에 하나의 원소만 갖도록 queue를 재사용했다

  4. HashMap을 List로 뽑고 정렬해서 answer return한다.

코드

		// map 에 queue 넣기
        for (String record : records) {
            String[] split = record.split(" ");
            int time = Integer.parseInt(split[0].substring(0, 2)) * 60 + Integer.parseInt(split[0].substring(3, 5));

            if (!map.containsKey(split[1])) {
                Queue<Integer> queue = new LinkedList<>();
                queue.add(time);
                map.put(split[1], queue);
            } else {
                Queue<Integer> queue = map.get(split[1]);
                queue.add(time);
                map.replace(split[1], queue);
            }
        }

HashMap에

 <key>	  <value>
차량번호     Queue[  ]
차량번호     Queue[  ]

형태로 저장

		// queue 시간 계산
        for (Map.Entry<String, Queue<Integer>> stringQueueEntry : map.entrySet()) {
            Queue<Integer> queue = stringQueueEntry.getValue();
            int time = 0;
            double finalFee = 0;
            while (queue.size() >= 2) {
                int in = queue.poll();
                int out = queue.poll();
                time += out - in;
            }
            if (queue.size() == 1) {
                int in = queue.poll();
                int out = 60 * 23 + 59;
                time += out - in;
            }

            // 주차비 계산
            if (time <= baseTime) {
                finalFee = baseFee;
            } else {
                finalFee = baseFee + Math.ceil((time - baseTime) / rateMin) * rateFee;
            }
            queue.add((int)finalFee);
            map.replace(stringQueueEntry.getKey(), queue);
        }

queue에 있는 값들을 이용해 주차비 계산

		List<String> keyList = new ArrayList<>(map.keySet());
        keyList.sort(String::compareTo);
        int i=0;
        for (String key : keyList) {
            answer[i] = map.get(key).poll();
            i++;
        }

정렬 후 정답 배열 저장

전체코드

import java.util.*;

class Solution {
    HashMap<String, Queue<Integer>> map = new HashMap<>();

    public int[] solution(int[] fees, String[] records) {
        // 맵에 queue 넣기
        for (String record : records) {
            String[] split = record.split(" ");
            int time = Integer.parseInt(split[0].substring(0, 2)) * 60 + Integer.parseInt(split[0].substring(3, 5));

            if (!map.containsKey(split[1])) {
                Queue<Integer> queue = new LinkedList<>();
                queue.add(time);
                map.put(split[1], queue);
            } else {
                Queue<Integer> queue = map.get(split[1]);
                queue.add(time);
                map.replace(split[1], queue);
            }
        }

        int[] answer = new int[map.size()];
        double baseTime = fees[0];
        double baseFee = fees[1];
        double rateMin = fees[2];
        double rateFee = fees[3];

        // queue 시간 계산
        for (Map.Entry<String, Queue<Integer>> stringQueueEntry : map.entrySet()) {
            Queue<Integer> queue = stringQueueEntry.getValue();
            int time = 0;
            double finalFee = 0;
            while (queue.size() >= 2) {
                int in = queue.poll();
                int out = queue.poll();
                time += out - in;
            }
            if (queue.size() == 1) {
                int in = queue.poll();
                int out = 60 * 23 + 59;
                time += out - in;
            }

            // 주차비 계산
            if (time <= baseTime) {
                finalFee = baseFee;
            } else {
                finalFee = baseFee + Math.ceil((time - baseTime) / rateMin) * rateFee;
            }
            queue.add((int)finalFee);
            map.replace(stringQueueEntry.getKey(), queue);
        }

        List<String> keyList = new ArrayList<>(map.keySet());
        keyList.sort(String::compareTo);
        int i=0;
        for (String key : keyList) {
            answer[i] = map.get(key).poll();
            i++;
        }

        return answer;
    }
}

느낀점

문제가 길 때는 시각자료(그림, 표)를 먼저 보고 이해하는 게 시간 단축에 좋다.
간단한 구현 문제였지만 Java 문법이 떠오르지않아 자바 문법을 찾아본다고 시간을 허비하였다.
Integer.ceil() 함수로 올림을 할 수 있고
Map은 List로 뽑아서 정렬하면 쉽다.

profile
DevOps Engineer
post-custom-banner

0개의 댓글