컴퓨터/프로그래머스
프로그래머스 - 92341번: 주차 요금 계산 [Java]
이상한 나그네
2023. 10. 29. 00:19
문제: https://school.programmers.co.kr/learn/courses/30/lessons/92341
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