컴퓨터/프로그래머스

프로그래머스 - 92341번: 주차 요금 계산 [Java]

이상한 나그네 2023. 10. 29. 00:19

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 코드

import java.util.*;
import java.time.*;
import java.time.temporal.ChronoField;
class Solution {
    public List<Integer> solution(int[] fees, String[] records) {
        List<Integer> answer = new ArrayList<>();
        Map <Integer, Integer> price = new TreeMap<>();
        Map <Integer, LocalTime> time = new HashMap<>();
        Map <Integer, Integer> count = new HashMap<>();
        
        for(String r : records) {
            LocalTime t = LocalTime.parse(r.substring(0, 5));
            int num = Integer.parseInt(r.substring(6, 10));
            String check = r.substring(11);
            
            if(!price.containsKey(num)) {
                price.put(num, 0);
                count.put(num, 0);
            }
            
            if(check.equals("OUT")) {
                int countTime = (int)(t.getLong(ChronoField.MINUTE_OF_DAY) - time.get(num).getLong(ChronoField.MINUTE_OF_DAY));
                count.put(num, count.get(num) + countTime);
                time.remove(num);
            }
            else time.put(num, t);
        }
        for(int key : time.keySet()) {
            LocalTime last = LocalTime.parse("23:59");
            int countTime = (int)(last.getLong(ChronoField.MINUTE_OF_DAY) - time.get(key).getLong(ChronoField.MINUTE_OF_DAY));
            count.put(key, count.get(key) + countTime);
        }
        
        for(int key : price.keySet()) {
            price.put(key, price.get(key) + fees[1]);
            int countTime = count.get(key);
            if(countTime > fees[0]) {
                countTime -= fees[0];
                int addPrice = countTime / fees[2] * fees[3];
                if(countTime % fees[2] != 0) addPrice += fees[3];
                price.put(key, price.get(key) + addPrice);
            }
            answer.add(price.get(key));
        }
        return answer;
    }
}

2. 설명

List<Integer> answer = new ArrayList<>();
Map <Integer, Integer> price = new TreeMap<>();
Map <Integer, LocalTime> time = new HashMap<>();
Map <Integer, Integer> count = new HashMap<>();

price의 경우 차량 번호 순서로 저장을 해야하기에 TreeMap을 사용하여 차량의 가격을 순차적으로 저장하며 time은 차량의 주차 시간이 저장되어 있으며 count는 주차 시간 정보를 저장합니다.

for(String r : records) {
    LocalTime t = LocalTime.parse(r.substring(0, 5));
    int num = Integer.parseInt(r.substring(6, 10));
    String check = r.substring(11);

    if(!price.containsKey(num)) {
        price.put(num, 0);
        count.put(num, 0);
    }

    if(check.equals("OUT")) {
        int countTime = (int)(t.getLong(ChronoField.MINUTE_OF_DAY) - time.get(num).getLong(ChronoField.MINUTE_OF_DAY));
        count.put(num, count.get(num) + countTime);
        time.remove(num);
    }
    else time.put(num, t);
}

records 배열에 저장된 내용을 읽으며 In이라면 time에 num 키값으로 LocalTime 값을 추가합니다.

OUT이라면 time에 저장된 시간정보를 기반으로 시간차이를 int형으로 변환하여 count에 저장하며 time에서 num을 키값으로 하는 것을 제거합니다.

for(int key : time.keySet()) {
    LocalTime last = LocalTime.parse("23:59");
    int countTime = (int)(last.getLong(ChronoField.MINUTE_OF_DAY) - time.get(key).getLong(ChronoField.MINUTE_OF_DAY));
    count.put(key, count.get(key) + countTime);
}

 

주차를 하고 나가지 않은 차량의 경우 time에 키 값이 존재하기에 23:59을 기준으로 차이의 값을 count에 추가하여 저장합니다.

for(int key : price.keySet()) {
    price.put(key, price.get(key) + fees[1]);
    int countTime = count.get(key);
    if(countTime > fees[0]) {
        countTime -= fees[0];
        int addPrice = countTime / fees[2] * fees[3];
        if(countTime % fees[2] != 0) addPrice += fees[3];
        price.put(key, price.get(key) + addPrice);
    }
    answer.add(price.get(key));
}

문제에 명시한 방식으로 요금을 계산해주고 주차 요금 값을 price에 저장 후 answer에 price의 값을 추가하면 문제는 해결됩니다.

3. 정리

  • 문제의 내용이 길지만 문제를 정확히 읽고 이해한다면 쉽게 해결될 수 있다.
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges