




import java.util.*;
class Solution {
public int[] solution(int[] fees, String[] records) {
Map<String,String> parking=new HashMap<>();
Map<String,Integer> result=new HashMap<>();
for(String s:records){
String[] record=s.split(" ");
if(record[2].equals("IN"))
parking.put(record[1],record[0]);
else{
if(result.containsKey(record[1]))
result.put(record[1],result.get(record[1])+calcTime(parking.get(record[1]),record[0]));
else
result.put(record[1],calcTime(parking.get(record[1]),record[0]));
parking.remove(record[1]);
}
}
for(String s:parking.keySet()){
if(result.containsKey(s))
result.put(s,result.get(s)+calcTime(parking.get(s),"23:59"));
else
result.put(s,calcTime(parking.get(s),"23:59"));
}
ArrayList<String> sortedNum= new ArrayList<>(result.keySet());
Collections.sort(sortedNum);
int[] answer=new int[result.size()];
for(int i=0; i<sortedNum.size();i++)
answer[i]=calcFee(result.get(sortedNum.get(i)),fees);
return answer;
}
public int calcTime(String in,String out){
int start=60*Integer.parseInt(in.split(":")[0])+Integer.parseInt(in.split(":")[1]);
int end=60*Integer.parseInt(out.split(":")[0])+Integer.parseInt(out.split(":")[1]);
return end-start;
}
public int calcFee(int time,int[] fees){
int fee=0;
time-=fees[0];
fee+=fees[1];
if(time>0){
if(time%fees[2]==0) fee+=fees[3]*(time/fees[2]);
else fee+=fees[3]*(time/fees[2]+1);
}
return fee;
}
}
(1) records를 순회하며 "IN"이 들어온 경우에는 parking(HashMap)에 넣어주고, "OUT"이 들어온 경우에는 calcTime() 메소드를 호출하여 주차 시간을 계산한 뒤 result(HashMap)에 넣어준다.
-> 이 때, 두 번 이상 입,출차 한 차가 있을 수도 있으니 result에 차 번호가 이미 있는지 확인하여, 이미 기록이 있는 차의 주차시간은 누적계산 해주어야 한다.
-> 주차 시간이 완료된 차는 parking(HashMap)에서 제거해 준다.
(2) (1)이 끝난 뒤, parking에 남아있는 차에 대해 출차 시간을 "23:59"로 설정하여 주차시간을 계산해 준다.
(3) result.keySet()을 통해 ArrayList를 생성하여Collections.sort() 함수로 차 번호에 대해 오름차순 정렬 해준다.
(4) (3)에서 얻은 ArrayList의 요소를 순회하며 calcFee() 메소드를 통해 요금을 계산하고, answer 배열에 값을 넣어준다.

과정이 살짝 귀찮긴 했지만, 큰 어려움이 없던 문제였다.
코드를 거의 다 짰을 때, 문제를 다시한번 읽으니 차 번호에 대해 오름차순으로 결과를 저장해야 한다는 것을 발견했다.
나는 HashMap 자료구조를 사용하여 코드를 짜고 있었기 때문에 어떻게 해야하나 고민하던 도중, ArrayList의 생성자에 Collection을 사용할 수 있다는 것이 떠올랐다.
그래서 ArrayList의 생성자에 result.keySet()을 넣어 생성해 준 뒤, Collections.sort() 함수로 차 번호에 대해 오름차순 정렬 할 수 있었다.
이런 문제는 코드를 짜기 전에 먼저 노트에 정리를 완벽하게 한 뒤 시작하는 것이 확실히 도움이 되는 것 같다.
출처 : 프로그래머스 코딩 테스트 연습 https://school.programmers.co.kr/learn/challenges