주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.
주차 요금을 나타내는 정수 배열 fees, 자동차의 입/출차 내역을 나타내는 문자열 배열 records가 매개변수로 주어집니다. 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ records의 길이 ≤ 1,000
처음에 문제를 보면서 어떤식으로 문제를 풀어나가야할지 고민을 좀 오래했던 것 같다.
카카오의 문자열 문제는 항상 문제를 푸는 전개방식이 중요한 것 같다.. 근데 항상 그게 바로 떠오르지가 않는다 ㅜㅜ
이 문제는 풀때 집중만 잘하면 자신의 전개방식 그대로 풀어나가면 되는 느낌?이라 (당연한 소리지만) 구현을 끝내고 이후 테스트케이스는 한번만에 통과할 수 있었다.
import java.util.*; class Solution { public int[] solution(int[] fees, String[] records) { List<Integer> ans = new ArrayList(); int[] answer = {}; Arrays.sort(records, new Comparator<String>() { @Override public int compare(String s1, String s2) { return s1.substring(6, 10).compareTo(s2.substring(6,10)); } }); boolean in = false; int time = 0, final_time = 0; String time_info, in_or_out; String car_number = records[0].substring(6,10); for(int i = 0; i < records.length; i++) { time_info = records[i].substring(0,5); if(!car_number.equals(records[i].substring(6,10))) { if(in) { final_time += 23 * 60 + 59 - time; in = false; } if(final_time <= fees[0]) ans.add(fees[1]); else ans.add(fees[1] + (int)Math.ceil((double) (final_time - fees[0]) / fees[2]) * fees[3]); car_number = records[i].substring(6,10); final_time = 0; } in_or_out = records[i].substring(11,12); int hour = Integer.parseInt(records[i].substring(0,2)) * 60; int min = Integer.parseInt(records[i].substring(3,5)); if(in_or_out.equals("I")) { time = hour + min; in = true; } else { final_time += hour + min - time; in = false; } } if(in) { final_time += 23 * 60 + 59 - time; in = false; } if(final_time <= fees[0]) ans.add(fees[1]); else ans.add(fees[1] + (int)Math.ceil((double) (final_time - fees[0]) / fees[2]) * fees[3]); return ans.stream().mapToInt(k -> k).toArray(); } }